我认为这个方法是正确的,但我错了:
static void Equals<T>(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二进制运算符过载分辨率
形式x的运算
op y,其中op是可重载的
二进制运算符,x是
类型x,y是类型的表达式
y,处理如下:
候选用户定义运算符集
由X和Y为操作提供
算符op(x,y)已确定。这个
集合由
X和提供的候选运算符
Y提供的候选运算符,
每一个都是根据
7.7.2.5。如果x和y是同一类型,
或者如果x和y是从
公共基类型,然后共享
候选运算符只出现在
组合一次。
如果
候选用户定义运算符是
不是空的,这就成了
的候选运算符
操作。否则,预定义的
二进制运算符操作实现,
包括他们举起的表格
的候选运算符集
操作。预定义的
给定运算符的实现
在
运营商(§7.7至§7.11)。
将第7.4.3节中的过载解决规则应用于候选运算符集,以选择与参数列表(x,y)相关的最佳运算符,此运算符将成为过载解决过程的结果。如果重载解析无法选择单个最佳运算符,则会发生编译时错误。
在步骤2中,我认为应该应用这个预定义的实现:
bool operator ==(object x, object y);
bool operator !=(object x, object y);
因为C中的一切都是从物体中产生的。如何在第3步发生编译时错误?在这种情况下,我不认为“过载分辨率无法选择”是可能的。
当我实施这样的事情时,我想到了这个问题:
class EnumComparer<TEnum> : IEqualityComparer<TEnum>
{
public bool Equals(TEnum x, TEnum y)
{
return x == y;
}
public int GetHashCode(TEnum obj)
{
return (int)obj;
}
}
恐怕我需要构建一个表达式并在
Equals
方法中动态调用它。 最佳答案
很适合你阅读说明书,但是你太快就停止阅读了。如果你读得再深一点,你就会读到这一点:
预定义的引用类型相等运算符需要下列之一:
两个操作数都是已知为引用类型或文本空的类型的值。此外,存在从一个操作数类型到另一个操作数类型的显式引用转换。
一个操作数是t类型的值,其中t是类型参数,另一个操作数是文本空值。而且t没有值类型约束。
除非这些条件之一为真,否则将发生绑定时间错误。(*)
错误不是来自重载解析;错误是重载解析将选择预定义的引用类型相等运算符,而您没有引用类型。
考虑一下你的代码。什么阻止t成为一个没有定义等式运算符的值类型?没有什么。假设我们回到了对象版本;两个操作数将框到不同的位置,因此引用不相等,即使它们具有相同的内容。因为这是缓慢的,混乱的和错误的,甚至尝试都是违法的。
你为什么一开始就想这么做?如果您的方法起作用了,但它没有,那么您的方法将比最初简单地使用==更糟糕。你打算用这种方法给世界带来什么价值?
(*)我已经向规范维护人员报告了这个句子中的语法错误。
关于c# - 运算符'=='不能应用于类型T吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5808057/