ReferenceEquals - true和Equals - false预期行为?

时间:2012-08-09 16:53:50

标签: c#

如果object.ReferenceEquals返回true,那么instance.Equals是否应该返回true?

您认为下面的输出是通过/失败的意外行为吗?

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

就我个人而言,我认为它很奇怪,并且无法真正想到良好的原因,其中一个实例不应该等于它自己。

2 个答案:

答案 0 :(得分:7)

有两种方法可以回答你的问题。

  • 这是出乎意料的行为,是的。正确设计的类应始终从.Equals返回true,如果它从.ReferenceEquals返回true。这已经编入MSDN的开发类库的设计指南 Implementing the Equals Method 文章:

      

    遵循Object.Equals方法中定义的合同,如下所示:
      x.Equals(x)返回true。

  • 但语言或运行时并未强制执行该要求。相关类的设计者可以完全自由地将Equals定义为{ return false; }。反常,但可能。

答案 1 :(得分:2)

是的,如果引用等于为真,则equals的正确实现应该返回true。