如何求解运算符’! =’不能应用于类型为‘ T’和‘ T’的操作数

这个代码片段按照 int类型的预期工作:

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

int被泛型 T取代时,编译器会抱怨:

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

为什么会发生这种情况,有办法解决吗?

104916 次浏览

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

using System.Collections.Generic;


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

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

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

如果使用 where关键字向类型参数添加约束,则编译器将允许您使用该类型接口方法运算符

约束 Tclass

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