我有一个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
或者,如果类型匹配以及数值,我应该只允许相等吗?
答案 0 :(得分:5)
没有。它违反了Object.Equals
:
以下语句必须适用于
Equals(Object)
方法的所有实现。在列表中,x
,y
和z
表示非空的对象引用。
- ...
x.Equals(y)
返回与y.Equals(x)
相同的值。
任何使用Equals
的东西都应该能够依赖它 - 所以违反它可能会产生一些非常奇怪的效果。想象一下,如果Dictionary<,>.ContainsKey
调用key.Equals(candidateEntry.Key)
但是索引器调用了candidateEntry.Key.Equals(key)
...您可能会看到一个键存在,但无法获取条目......反之亦然。或者它可能在Dictionary<,>
的一个实现中起作用,但在后续版本中不起作用(或者不在Mono上等)。