不一致的Equals和GetHashCode方法(Inconsistency in Equals a

2019-07-31 17:22发布

阅读这个问题后为什么“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)
  1. 之间差(3)和(4)断开,等于应该是对称的要求。
  2. 之间差(2)和(4)不与相干MSDN说明书 ,说:

    如果两个对象不表示相同的对象引用,也不是零,它调用objA.Equals(objB)并返回结果。 这意味着,如果objA覆盖的Object.Equals(Object)方法,此覆盖被调用。

  3. 之间差(3)和(5)表示运算符==返回true,但是对象不在的Equals方面相等。
  4. 之间差(4),(5),(6)和(7)是指两个对象在操作者而言等于==并且等于,但是它们具有不同的散列码。

我如果任何人都可以解释为什么这种在我看来不一致的行为是相当基本的.NET类型观察到非常感兴趣。

Answer 1:

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

另一比较上的工作int和一个sbyte ,根据定义是不同的。 j.Equals(i)进到过载int.Equals(object) ,因为该参数不是隐式转换为sbyte

Equals对他们来说是对称的,但你的代码是没有的。 如果禁止使用隐式转换i.Equals((object)j) ,它会返回false ,显示出Equals的确是对称的。



文章来源: Inconsistency in Equals and GetHashCode methods