我应该允许不对称平等吗?

Xen*_*ate 3 c# symmetric iequatable

我有一个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
Run Code Online (Sandbox Code Playgroud)

或者,如果类型匹配以及数值,我应该只允许相等吗?

Jon*_*eet 5

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

对于该Equals(Object)方法的所有实现,以下语句必须为true .在列表中x,yz代表对象引用不为空.

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

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