为什么C#编译器会抱怨pragma警告660& 661
添加其他运算符时,例如:
public static bool operator ==(FooClass foo, string fooId)
我不指定
public static bool operator ==(FooClass foo, FooClass foo2)
这有意义覆盖Object.Equals和GetHashCode。
这只是编译器中的一个限制,它没有正确检查运算符中指定的参数吗?
答案 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"];