C#运算符重载==和编译指示警告660&当不相关时,661不会覆盖Equals和GetHashCode

时间:2013-10-24 15:42:03

标签: c# operator-overloading

为什么C#编译器会抱怨pragma警告660& 661

  • “FooClass”定义operator ==或operator!=但不覆盖Object.Equals(object o)
  • “FooClass”定义operator ==或operator!=但不覆盖Object.GetHashCode()

添加其他运算符时,例如:

public static bool operator ==(FooClass foo, string fooId)

指定

public static bool operator ==(FooClass foo, FooClass foo2)

这有意义覆盖Object.Equals和GetHashCode。

这只是编译器中的一个限制,它没有正确检查运算符中指定的参数吗?

1 个答案:

答案 0 :(得分:1)

一般准则是foo == bar应该返回与foo.Equals(bar)相同的结果,这就是警告的原因。这是一个指导原则,而不是一项要求,这就是为什么它是警告而不是错误。

第二个警告是因为if(foo.Equals(bar)) foo.GetHashCode() == bar.GetHashCode()的规则。如果两个对象相等,则它们的哈希码也应该相等。 .NET框架和第三方库中的许多东西都依赖于此,所以如果你不这样做,Dictionary使用GetHashCode()进行查找的东西就会破坏。

所以,如果我能做到

FooClass foo = new FooClass("Foo");
if(foo == "Foo")
{
   //...
}

我希望能够做到

FooClass foo = new FooClass("Foo");
Hashtable hash = new Hashtable();
hash.Add(foo, "Bar");
var result = hash["Foo"];