如何解决算子'!='不能应用于'T'和'T'类型的操作数

时间:2012-01-24 06:03:14

标签: c# generics

此代码段按预期用于int类型:

public class Test {
    public int Value
    {
        get { return _Value; }
        set
        {
            if (_Value != value)
            {
                _Value = value;
            }
        }
    }
    private int _Value;
}

int被通用T替换时,编译器会抱怨:

  

运算符'!='不能应用于'T'和'T'类型的操作数

为什么会发生这种情况并且有办法解决它?

3 个答案:

答案 0 :(得分:130)

using System.Collections.Generic;

public class Test<T>
{
    public T Value
    {
         get { return _Value; }
         set
         {
            // operator== is undefined for generic T; EqualityComparer solves this
            if (!EqualityComparer<T>.Default.Equals(_Value, value))
            {
                _Value = value;
            }
         }
    }
    private T _Value;
}

答案 1 :(得分:78)

T是一个类型参数,可以是classstruct,因此编译器不允许您执行类和结构中不存在的操作。

结构体默认情况下没有==和!=(但可以添加),这就是编译器抱怨的原因。

如果使用where关键字向type参数添加约束,编译器将允许您使用该类型\ interface method \ operators

T约束为class

public class Test<T> where T : class
{
     public T Value
     {
         private T _Value;

         get { return _Value; }
         set
         {
             if (_value != value)
                 _Value = value;             
         }
     }
}

或者只使用Equals代替==运算符

public class Test<T>
{
     public T Value
     {
         private T _Value;

         get { return _Value; }
         set
         {
             if (!_value.Equals(value)
                 _Value = value;             
         }
     }
}

答案 2 :(得分:21)

T可以是任何类型。除非在(struct)类型上定义了这样的运算符,否则不能在结构上使用== / !=