我一直试图找出为什么这两个操作返回不同的值:
-
Double.NaN == Double.NaN
回报false
-
Double.NaN.Equals(Double.NaN)
回报true
我有answer https://stackoverflow.com/questions/1145443/why-is-double-nan-not-equal-to-itself到第一部分,但不是第二部分,也不到“为什么这两个比较返回不同的值”
造成这种差异的原因虽然不明显,但也很简单。
如果您使用相等运算符==
,那么您正在使用 IEEE 平等测试。
如果您正在使用Equals(object)
方法,那么你必须维护合同object.Equals(object)
。当你实现这个方法(以及相应的GetHashCode
方法),你必须维护该契约,这与 IEEE 的行为不同。
If the Equals
如果不遵守合约,那么哈希表的行为就会被破坏。
var map = new Dictionary<double,string>();
map[double.NaN] = "NaN";
var s = map[double.NaN];
If !double.NaN.Equals(double.NaN)
,你永远无法从字典中得到你的值!
如果前一句没有意义,那么请理解散列的机制(用于Dictionary<T,U>
, HashSet<T>
等)同时使用object.Equals(object)
and object.GetHashCode()
方法广泛,并依赖于其行为的保证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)