簡體   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