我认为这种方法是有效的,但我错了:
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.2.5 节的规则确定。如果 X 和 Y 是相同的类型,或者如果 X 和 Y 派生自一个共同的基本类型,则共享候选运算符仅在组合集中出现一次。
如果候选用户定义运算符的集合不为空,则这成为该操作的候选运算符集合。否则,预定义的二元运算符 op 实现,包括它们的提升形式,将成为该运算的候选运算符集。给定运算符的预定义实现在运算符的描述中指定(第 7.7 节到第 7.11 节)。
§7.4.3 的重载决策规则应用于候选运算符集,以选择关于参数列表 (x, y) 的最佳运算符,该运算符成为重载决策过程的结果。如果重载决策未能选择单个最佳运算符,则会发生编译时错误。
在第 2 步中,我认为应该应用这个预定义的实现:
bool operator ==(object x, object y);
bool operator !=(object x, object y);
因为 C# 中的所有内容都派生自 Object。步骤 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
方法中动态调用它。