C# 运算符重载 == 和杂注警告 660 和 661 在不相关时不覆盖 Equals 和 GetHashCode

本文关键字:不相关 Equals GetHashCode 覆盖 重载 运算符 警告 | 更新日期: 2023-09-27 18:36:49

为什么C#编译器会抱怨杂注警告660和661

  • "FooClass" 定义了运算符 == 或运算符 !=,但不覆盖 Object.Equals(object o)
  • "FooClass" 定义了运算符 == 或运算符 !=,但不覆盖 Object.GetHashCode()

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

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

我没有具体说明

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

这对于覆盖Object.Equals和GetHashCode是有意义的。

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

C# 运算符重载 == 和杂注警告 660 和 661 在不相关时不覆盖 Equals 和 GetHashCode

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

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

所以如果我能做到

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"];