c# – Equalsistency in Equals和GetHashCode方法

前端之家收集整理的这篇文章主要介绍了c# – Equalsistency in Equals和GetHashCode方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
阅读这个问题 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)之间的差异打破了等于对称的要求.@H_301_5@>(2)和(4)之间的区别与MSDN specification不一致:

If the two objects do not represent the same object reference and@H_301_5@ neither is null,it calls objA.Equals(objB) and returns the result.@H_301_5@ This means that if objA overrides the Object.Equals(Object) method,@H_301_5@ this override is called.

>(3)和(5)之间的区别意味着operator ==返回true,但是对象在Equals方面不相等.@H_301_5@>(4),(5),(6)和(7)之间的区别意味着两个对象在operator ==和Equals方面相等,但是它们具有不同的哈希码.

我非常感兴趣,如果有人可以解释为什么在我看来,在相当基本的.NET类型中观察到不一致的行为.

解决方法

你的问题是你错过了i.Equals(j)中的隐式转换.它去重载int.Equals(int).在这里你要比较我和(int)j,这是同样的事情.相同的隐式转换发生在==.

其他比较工作在一个int和一个sbyte,根据定义是不同的. j.Equals(i)转到重载int.Equals(object),因为参数不是隐式转换为sbyte.

等于它们是对称的,但是你的呼叫代码不是.如果使用i.Equals((object)j)抑制隐式转换,它将返回false,表明Equals确实是对称的.

猜你在找的C#相关文章