比较NaN和null返回非逻辑值

本文关键字:非逻辑 逻辑值 返回 null NaN 比较 | 更新日期: 2023-09-27 18:09:58

为什么下面的代码片段返回1:

double i = double.NaN;
double? i2 = null;
i.CompareTo(i2);
在我看来,这毫无意义。使用Exception更合适。

你认为这个决定背后的原因是什么

比较NaN和null返回非逻辑值

来自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时抛出异常,那么排序和类似的事情将需要大量额外的异常处理。

当您反编译doubleCompareTo时,您可以看到:

public int CompareTo(object value)
{
  if (value == null)
    return 1;

只是将空元素放在任何排序序列的底部。