在结构中,通过Equals实现operator ==是否有效,但不能覆盖Equals和GetHashCode?

时间:2010-09-06 08:05:45

标签: c# .net operator-overloading equals equals-operator

这有效吗?

public struct MyStruct
{
    public int Foo { get; set; }

    public static bool operator ==(MyStruct a, MyStruct b)
    {
        return a.Equals(b);
    }

    public static bool operator !=(MyStruct a, MyStruct b)
    {
        return !a.Equals(b);
    }
}

(我知道它效率稍低,因为默认情况下Object.Equals会对值类型使用反射。但是它有效吗?)

我问,因为ReSharper突出显示它并警告我MyStruct defines operator '==' or operator '!=' but does not provide 'Object.Equals(object o)' and 'Object.GetHashCode()'

3 个答案:

答案 0 :(得分:4)

我认为this可能很有趣。

答案 1 :(得分:3)

有效吗?是。但它并没有给你买任何东西。

答案 2 :(得分:2)

就编译而言,它是有效的。但它在某种意义上是“无效的”,它打破了你的类用户的所有期望 - 框架设计指南规定你不应该实现仅存在于运算符重载中的功能 - 这些方法应该可以通过其他方式访问。标准是Object.Equals和operator ==实现相同的功能。

(Can only find the 1.1 version of the guidelines at the moment)

  

提供备用签名。最   语言不支持运营商   超载。因此,它是一个   对所有类型的CLS要求   重载运算符包括一个   辅助方法与适当的   提供的特定于域的名称   等效功能。它是一个   通用语言规范(CLS)   提供此次要的要求   方法。以下示例是   符合CLS。