无法将T value1与T value2 = default(T)进行比较。 为什么以及如何在C#上做到这一点?
我正在尝试以下方法:
T value1 = el.value; // it's of type T already T value2 = default(T); if (value1 != value2) // gives the following error: Operator '!=' cannot be applied to operands of type 'T' and 'T' { // ... }
那么,我怎么能比较这两个值呢? 为什么会出现这种错误?
提前致谢!
你可以像Henk提到的那样使用where T : IEquatable
约束,或者忽略约束并使用:
if (!EqualityComparer.Default.Equals(value1, value2))
您周围的generics类应列出约束: T : IEquatable
然后你必须使用value1.Equals(value2)
所有这一切的原因是并非所有类型都定义operator ==
这有什么问题?
if (!value1.Equals(value2))
应该是“交叉对象”.. 🙂
如果你使用value1.equals(value2),那么你有一个null值的问题。 更好:
的Object.Equals(值1,值2)
或者参考类型(小心):
object.referenceEquals(值1,值2)
并非所有类型都具有==
运算符的默认实现。 对于类,默认的==
操作是比较引用。 对于结构体,不存在此类默认实现。
您可以在C#中为generics类型参数添加类型约束。 遗憾的是,您无法定义强制类型具有==
运算符实现的约束。 你可以做的最好的事情是强制类型成为一个类: where T: class
。 一篇关于C#中类型参数约束的文章
尝试
Equals(value1, value2)
避免null ref的好方法
你可以做的另一件事是定义比较运算符(实际上,差异运算符),以便能够比较类型T的元素。编写value1 != value2
,编译器本身并不能真正知道你的意思,除了如果先前已经定义了运算符。
要定义运算符,您可以使用
public operator!=(T a, T b) { // Comparison code; returns true or false }