![](/img/trans.png)
[英]Overriding Equals and GetHashCode doesn't necessarily override equality overloading operator
[英]C# operator overloading == and pragma warnings 660 & 661 not overriding Equals and GetHashCode when irrelevant
为什么C#编译器会抱怨pragma警告660和661
添加其他运算符时,例如:
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.