如何解决运算符'!='不能应用于'T'和'T'types的操作数

这个代码片段按照预期的inttypes工作:

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

int被genericsTreplace时,编译器会抱怨:

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

为什么会发生这种情况,是否有办法解决这个问题?

 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; } 

T是一个types参数,可以是一个class或一个struct ,因此编译器不会让你执行在类和结构中不存在的动作。

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

如果使用where关键字将一个约束添加到types参数,编译器将允许您使用该types\ 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; } } } 

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