2012-11-16 141 views
8

可能重複:
Is it necessary to override == and != operators when overriding the Equals method? (.NET)爲什麼重寫==必須重寫equals?

C#編譯器會提示我,我應該重寫等於如果重寫==,我只是想知道爲什麼嗎?

+3

可能的重複:http://stackoverflow.com/q/1222035/238902 – Default

+1

@Default其實,我不認爲它是重複的 - 但它們是鏈接的。這一個是「當提供==時,我應該覆蓋Equals?」 (答案通常是:是),其中「另一個是」當重寫Equals時,我必須提供==嗎? (答案一般是:不,不是) –

回答

4

因爲否則你會有兩個語義上相似的操作,可能會產生不同的結果,這意味着很多混淆。

我不確定編譯器是否會阻止您,或者它只是一個警告,但無論如何,通常都會確保它們的行爲相同。

有這樣的事情,double.NaN == double.NaNdouble.NaN.Equals(double.NaN)

+0

+1:有趣的是,我並不知道double.NaN.Equals(double.NaN)== true'。 – Henrik

12

通過==如果要重新定義平等,它得到真的混亂,如果==做某事.Equals很大的不同,.Equals必須回退,因爲當類型沒有在編譯時已知,只有.Equals是可用。因此,定義==確實意味着:定義==,!=,EqualsGetHashCode,並且可能對某些T實施IEquatable<T>

+0

+1是的,'double.NaN'在你遇到錯誤時刺痛:-) –

+0

==和Equals在所有情況下都不可能相同,我認爲它們不應該被期望。更有幫助的是'=='在它可用的地方是一致的,'Equals'在任何地方都是一致的(因爲它在任何地方都是可用的)。一個規則是,表示相同數字的數字類型應該比較'==',即使它們在其他方面有所不同,而只有100%等價的東西才應該比較爲'Equals',那麼恕我直言比現在存在的mishmosh更有幫助。 – supercat

+0

事實上,沒有很好的方法來定義例如一個將Decimal值映射到字符串表示的字典,因爲字典無法區分數字「1.0m」和「1.00m」(其字符串表示應該不同)。 == ==運算符應該將這些值視爲相等,但這並不意味着「Equals」應該。此外,定義'=='重載的方式,它往往不能實現等價關係,並且不能真正測試數值相等,因爲例如, '16777217 == 16777216.0f'。 – supercat

1

因爲否則你會得到不同的結果取決於你如何做比較。

x == y可以給出與y == x不同的結果(如果xy是不同的類型)。其他比較,如查找列表中的值或將其用作字典中的鍵不使用==運算符,因此根本不起作用。

+0

爲什麼會有所不同?有什麼命令? –

+0

@MatíasFidemraizer:因爲'x == y'會在'x'值上使用'=='運算符,但'y == x'會在'y'值上使用'=='運算符。如果它們以不同方式實現(例如'y'使用默認的對象比較),他們給出了不同的結果。 – Guffa

+0

啊,我明白了。但是如果'x'和'y'有不同的類型就會發生這種情況。如果兩者都具有相同的類型,則'x == y'或'y == x'應該以相同的方式表現。也許你應該在我們的答案中指出這一點。 –

相關問題