我正在阅读MSDN documentation about object.Equals
。在评论部分提到:
如果两个对象不表示相同的对象引用和 既不是null,它调用 objA.Equals(objB)并返回结果。 这意味着如果objA重写Object.Equals(Object)方法, 调用此覆盖。
我的问题是为什么他们没有将这部分实现为objA.Equals(objB) && objB.Equals(objA)
以使等式对称并且只关系到关系的一边?调用object.Equals
时可能会导致奇怪的行为。
编辑:当objA的类型覆盖Equals
方法并将其实现为不可预测的内容时,可能会发生奇怪的行为,但objB的类型不会覆盖Equals
。
答案 0 :(得分:49)
基本上,这只对具有有缺陷的Equals
实现的开发人员有用。来自documentation:
以下语句必须适用于
Equals(Object)
方法的所有实现。在列表中,x
,y
和z
表示非空的对象引用。
- [...]
x.Equals(y)
返回与y.Equals(x)
相同的值。- [...]
因此,在正确实施该方法的每种情况下,检查都是多余的 - 导致每个开发人员都做了正确的事情。
对于没有做正确的事情的开发人员来说,它甚至不是非常有用,因为他们可能仍希望object.Equals(x, y)
在返回true
时返回false
1}} - 他们可以调试并发现他们的方法毕竟返回true。你可以说,它会记录下来检查两种方式 - 但是我们已经确定了影响的唯一开发人员是那些不读文档的人。
基本上,当您覆盖方法或实现接口时,您应该知道自己在做什么并遵守指定的合同。如果你不这样做,你将得到奇怪的行为,我不认为期望每个调用者尝试解决那些不符合他们意图的实现的实现是不合理的。