代码之家  ›  专栏  ›  技术社区  ›  Stefan Monov

在结构中,实现operator==via equals是否有效,但不重写equals和gethashcode?

  •  3
  • Stefan Monov  · 技术社区  · 14 年前

    这是有效的吗?

    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 回复  |  直到 14 年前
        1
  •  3
  •   Dan Tao    14 年前

    有效吗?对。但它不会给你买任何东西。

        2
  •  4
  •   HCL    14 年前

    我想 this 可能很有趣。

        3
  •  2
  •   Damien_The_Unbeliever    14 年前

    从编译的事实来看,它是有效的。但从某种意义上说,它“无效”,因为它打破了类用户的所有期望——框架设计准则规定,不应该实现只存在于运算符重载中的功能——这样的方法应该以其他方式可访问。标准是object.equals和operator==实现相同的功能。

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

    提供备用签名。大多数 语言不支持运算符 超载。因此,它是一个 所有类型的CLS要求 重载运算符以包括 第二种方法 提供 等效功能。这是一个 通用语言规范(CLS) 提供此辅助设备的要求 方法。下面的例子是 符合CLS。