2012-08-09 114 views
3

如果object.ReferenceEquals返回true,應該instance.Equals總是返回true?是ReferenceEquals - true和Equals - 錯誤的預期行爲?

您是否認爲其下面的輸出是合格/不合格的意外行爲?

Assert.True(object.ReferenceEquals(obj,obj)); 
Assert.True(obj.Equals(obj)); 

我個人認爲它的奇怪,真的不能想到一個好原因,其中一個實例不應該等於本身。

+0

你到底在問什麼?反過來並不總是如此。 – 2012-08-09 17:57:25

+0

什麼部分不清楚?我知道相反情況並非總是如此,但正面應該始終如此。 – jasper 2012-08-10 17:56:11

回答

7

有兩種方法可以回答你的問題。

  • 這是意想不到的行爲,是的。如果設計良好的課程從.ReferenceEquals返回true,則始終應該從.Equals返回true。這是編纂MSDN的設計準則類庫開發Implementing the Equals Method文章:

    按照上的Object.Equals方法定義的合同如下:
              x.Equals(x)返回true。

  • 但是該要求不是由語言或運行時實施的。有關課程的設計者完全可以自由地將Equals定義爲{ return false; }。乖,,但可能。

+0

我不知道爲什麼其他答案(它已被刪除)得到downvoted,因爲它說與這一個相同。這很尷尬,但可能。我們需要知道該對象的類才能更好地理解它。 +1無論如何 – 2012-08-09 17:04:30

+0

店主刪除了它,@Andre。 – 2012-08-09 17:05:08

+0

確實,但有人低估了它,我不同意。無論如何,你的答案更完整。 – 2012-08-09 17:06:02

2

是的,如果引用equals爲true,則equals的正確實現應該返回true。

+0

嚴格來說,沒有。如果Equals被重寫,做一些愚蠢的事情,即。強制不平等,即使它們是相同的實例,等式也不會返回真。 – 2012-08-09 16:57:33

+1

@StefanH - 我的意思是平等執行*應該*,而不是*將*返回true。 – manojlds 2012-08-09 16:58:48