如何解决运算符'!='不能应用于'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上定义了这些运算符,否则不能在结构体上使用== / != 。