3

我有一个 C# 类型,将其与 int 进行比较是合乎逻辑的。调用这种类型Number

但是,我无法使 Equals 对称,因为我无法更改Int32.Equals(object other). 那么,我是否应该允许不对称相等,如下所示:

Number numberThree = new Number(3);
int intThree = 3;

bool equal;
equal = numberThree.Equals(intThree); // equal is true
equal = intThree.Equals(numberThree); // equal is false

或者我应该只在类型匹配以及数值匹配的情况下才允许相等?

4

1 回答 1

6

不,它违反了以下合同Object.Equals

对于该Equals(Object)方法的所有实现,以下陈述必须为真。在列表中,xyz表示不为空的对象引用。

  • ...
  • x.Equals(y)返回与 相同的值y.Equals(x)

任何使用Equals都应该能够依赖于它——因此违反它可能会产生一些非常奇怪的效果。想象一下,如果Dictionary<,>.ContainsKey调用key.Equals(candidateEntry.Key)但索引器调用candidateEntry.Key.Equals(key)......您可能会看到一个键存在,但无法获取条目......反之亦然。或者,它可能会在 的一个实现中起作用Dictionary<,>,但在后续版本中不起作用(或在 Mono 等上不起作用)。

于 2014-10-15T08:49:52.667 回答