3

为什么 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 是有意义的。

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

4

1 回答 1

1

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

第二个警告是因为if(foo.Equals(bar)) foo.GetHashCode() == bar.GetHashCode(). 如果两个对象相等,那么它们的哈希码也应该相等。.NET 框架和 3rd 方库中的许多东西都依赖于此,因此如果您不这样做,那么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"];
于 2013-10-24T16:53:34.490 回答