![](/img/trans.png)
[英]Implemeting GetHashCode and Equals methods for ValueObjects
[英]Inconsistency in Equals and GetHashCode methods
读完这个问题后为什么“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)
如果两个对象不表示相同的对象引用且都不为null,则它调用objA.Equals(objB)并返回结果。 这意味着如果objA重写Object.Equals(Object)方法,则调用此覆盖。
我很感兴趣,如果有人能解释为什么我认为在相当基本的.NET类型中观察到不一致的行为。
你的问题是你错过了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
确实是对称的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.