[英]Can't compare T value1 with T value2 = default(T). Why and how to do that on 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<T>
约束,也可以忽略约束并使用:
if (!EqualityComparer<T>.Default.Equals(value1, value2))
您周围的泛型类应列出一个约束: T : IEquatable<T>
然后您必须使用value1.Equals(value2)
所有这些的原因是,并非所有类型都定义运算符==
这怎么了
if (!value1.Equals(value2))
应该是“交叉对象” .. :)
如果您使用value1.equals(value2),则表示空值存在问题。 更好:
object.equals(value1,value2)
或对于参考类型(请小心):
object.referenceEquals(value1,value2)
并非所有类型都有==
运算符的默认实现。 对于类,默认的==
操作是比较引用。 对于结构,不存在这样的默认实现。
您可以在C#中向通用类型参数添加类型约束。 不幸的是,您无法定义一个强制类型强制实现==
运算符的约束。 最好的办法是将类型强制为class: where T: class
。 有关C#中的类型参数约束的文章
尝试
Equals(value1, value2)
避免空引用的好方法
您可以做的另一件事是定义比较运算符(实际上是这里的差分运算符),以便能够比较类型T的元素。就其本身而言,编译器在编写value1 != value2
时无法真正理解您的意思,除了如果运算符已在前面定义。
要定义一个运算符,您将使用
public operator!=(T a, T b) {
// Comparison code; returns true or false
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.