繁体   English   中英

无法将T值1与T值2 = default(T)进行比较。 为什么以及如何在C#上做到这一点?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM