此代码段按预期用于int
类型:
public class Test {
public int Value
{
get { return _Value; }
set
{
if (_Value != value)
{
_Value = value;
}
}
}
private int _Value;
}
当int
被通用T
替换时,编译器会抱怨:
运算符'!='不能应用于'T'和'T'类型的操作数
为什么会发生这种情况并且有办法解决它?
答案 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
是一个类型参数,可以是class
或struct
,因此编译器不允许您执行类和结构中不存在的操作。
结构体默认情况下没有==和!=(但可以添加),这就是编译器抱怨的原因。
如果使用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)类型上定义了这样的运算符,否则不能在结构上使用==
/ !=
。