无法将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 }