如何解决运算符'!='不能应用于'T'和'T'types的操作数
这个代码片段按照预期的int
types工作:
public class Test { public int Value { get { return _Value; } set { if (_Value != value) { _Value = value; } } } private int _Value; }
当int
被genericsT
replace时,编译器会抱怨:
运算符'!='不能应用于'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上定义了这些运算符,否则不能在结构体上使用==
/ !=
。