如何解决操作员'=';不能应用于类型为';T';和';T';
本文关键字:不能 应用于 类型 解决 操作员 何解决 | 更新日期: 2023-09-27 18:21:09
此代码片段对int
类型起到预期的作用
public class Test
{
public int Value
{
get => _Value;
set
{
if (_Value != value)
_Value = value;
}
}
private int _Value;
}
当int
被通用T
替换时,编译器会抱怨:
运算符'!='不能应用于类型为"T"answers"T"的操作数
为什么会发生这种情况,有办法解决吗?
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
是一个类型参数,可以是class
或struct
,因此编译器不允许您执行类和结构中都不存在的操作。
structs没有==和!=默认情况下(但可以添加),这就是编译器抱怨的原因。
如果使用where
关键字向类型参数添加约束,编译器将允许您使用该类型''接口方法''运算符
将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
可以是任何类型。不能在结构上使用==
/!=
,除非在(struct)类型上定义了此类运算符。