阅读完这个问题Why do "int" and "sbyte" GetHashCode functions generate different values?后,我想进一步了解以下行为:
sbyte i = 1;
int j = 1;
object.Equals(i, j) //false (1)
object.Equals(j, i) //false (2)
i.Equals(j) //false (3)
j.Equals(i) //true (4)
i == j //true (5)
j == i //true (6)
i.GetHashCode() == j.GetHashCode() //false (7)
- (3)和(4)之间的区别违反了Equals应该是对称的要求。
- (2)和(4)之间的区别与MSDN规范不一致,规范说:
如果两个对象不代表相同的对象引用并且都不为null,则会调用objA.Equals(objB)并返回结果。这意味着如果objA重写了Object.Equals(Object)方法,则会调用此重写。
- (3)和(5)之间的区别意味着操作符==返回true,但是从Equals的角度来看,对象并不相等。
- (4)、(5)、(6)和(7)之间的区别意味着两个对象在操作符==和Equals方面相等,但它们具有不同的哈希码。
我非常想知道是否有人可以解释为什么在相当基本的.NET类型中观察到这种我认为不一致的行为。
a.Equals((object)b)
明确意味着a.GetHashCode()==b.GetHashCode()
。我会称任何类型,如果==
与Equals
的行为不同,即使 .net 不严格要求这样做,也是有问题的。(忽略隐式转换,并假设运行时类型和静态类型相同) - CodesInChaos