繁体   English   中英

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

[英]C# operator overloading == and pragma warnings 660 & 661 not overriding Equals and GetHashCode when irrelevant

为什么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。

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

一般准则是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"];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM