Csharp/C#教程:运算符’==’无法应用于类型T?分享


运算符’==’无法应用于类型T?

我认为这种方法有效,但我错了:

static void Equals(T x, T y) { return x == y; //operator == can't be applied to type T } 

在阅读了规范(v3.0中的第7.2.4节和v4.0中的第7.3.4节)之后:

7.2.4二元运算符重载决策

forms为x op y的操作,其中op是可重载的二元运算符,x是类型X的表达式,y是类型Y的表达式,按如下方式处理:

在第2步中,我认为应该应用此预定义实现:

 bool operator ==(object x, object y); bool operator !=(object x, object y); 

因为C#中的所有内容都来自Object。 如何在步骤3中发生编译时错误? 在这种情况下,我认为“重载决议无法选择”是可能的。

编辑当我实现这样的事情时,我想到了这个问题:

 class EnumComparer : IEqualityComparer { public bool Equals(TEnum x, TEnum y) { return x == y; } public int GetHashCode(TEnum obj) { return (int)obj; } } 

我担心我需要构建一个表达式并在Equals方法中动态调用它。

阅读规范对你有好处,但你很快就停止了阅读。 如果你进一步阅读,你会得到这一点:


预定义的引用类型相等运算符需要以下之一:

除非其中一个条件成立,否则会发生绑定时错误。 (*)


错误不是来自重载决策; 错误是重载决策将选择预定义的引用类型相等运算符,并且您没有引用类型。

考虑你的代码。 什么阻止T成为没有定义相等运算符的值类型? 没有。 假设我们回到了对象版本; 两个操作数都会包含在不同的位置,因此即使它们具有相同的内容,它们也是引用不相等的。 由于这是缓慢,混乱和错误,甚至尝试也是违法的。

你为什么要首先尝试做这件事? 如果你的方法不起作用,那么你的方法会比首先使用== 更糟糕 。 您打算使用此方法向世界添加的价值是多少?


(*)我已经向规范维护者报告了这句话中的语法错误。

如果它知道where T : class做参考比较,那可能会有用。 运营商通常对generics的支持很少,但有一些解决方法。 MiscUtil为generics运算符提供间接支持 ,否则EqualityComparer.Default.Equals(x,y)是一个不错的选择。

我喜欢使用EqualityComparer.Default

它基于重写的Equals方法,但在可用时使用IEquatable ,避免对实现它的值类型进行装箱。

 EqualityComparer.Default.Equals(x, y) 

使用.Equals()方法并确保T实现IComparable

上述就是C#学习教程:运算符’==’无法应用于类型T?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/997954.html

(0)
上一篇 2021年12月26日
下一篇 2021年12月26日

精彩推荐