比较NaN和null返回非逻辑值
本文关键字:非逻辑 逻辑值 返回 null NaN 比较 | 更新日期: 2023-09-27 18:09:58
为什么下面的代码片段返回1:
double i = double.NaN;
double? i2 = null;
i.CompareTo(i2);
在我看来,这毫无意义。使用Exception更合适。
你认为这个决定背后的原因是什么
来自CompareTo的文档:
value形参必须为null或Double类型的实例;否则,抛出异常。Double的任何实例,不管它的值,被认为大于null。
示例中的value参数为null
。因此,NaN
被认为大于null,这就是CompareTo
正确返回1
的原因。
来自IComparable.CompareTo()
的MSDN文档:
根据定义,任何对象的比较值大于(或小于)null,并且两个null引用的比较值彼此相等。
这在Double.CompareTo(object)
文档中也很明显:
如果此实例大于value,则返回一个正整数。-or-这个实例是一个数字,而value不是一个数字(NaN)。-or- value是一个空引用(在Visual Basic中没有)。
Adam Houldsworth指出,如果something.CompareTo(somethingElse)
在somethingElse为null时抛出异常,那么排序和类似的事情将需要大量额外的异常处理。
当您反编译double
的CompareTo
时,您可以看到:
public int CompareTo(object value)
{
if (value == null)
return 1;
只是将空元素放在任何排序序列的底部。