Equals和GetHashCode方法中的不一致

读完这个问题之后为什么“int”和“sbyte”GetHashCode函数会生成不同的值? 我想进一步挖掘并发现以下行为:

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)之间的区别意味着operator ==返回true,但是在Equals方面对象不相等。
  • (4),(5),(6)和(7)之间的区别意味着两个对象在运算符==和Equals方面相等,但是它们具有不同的哈希码。
  • 我很感兴趣,如果有人能解释为什么我认为这种不一致的行为是在相当基本的.NET类型中观察到的。


    你的问题是你错过了i.Equals(j)的隐式转换。 它进入重载int.Equals(int) 。 在这里,你比较i(int)j ,这是同样的事情。 ==发生同样的隐式转换。

    其他比较在intsbyte ,根据定义它们是不同的。 j.Equals(i)进入重载int.Equals(object) ,因为参数不能隐式转换为sbyte

    Equals他们是对称的,但你的调用代码不是。 如果用i.Equals((object)j)隐式转换,它将返回false ,表明Equals确实是对称的。

    链接地址: http://www.djcxy.com/p/39785.html

    上一篇: Inconsistency in Equals and GetHashCode methods

    下一篇: C# overriding GetHashCode on a string type