比较NaN和null会返回不合逻辑的值

时间:2013-04-18 15:42:53

标签: c#

为什么以下代码段返回1:

double i = double.NaN;
double? i2 = null;
i.CompareTo(i2);

从我的观点来看,没有任何意义。 例外情况会更合适。

您认为决定背后的原因是什么?

3 个答案:

答案 0 :(得分:4)

来自CompareTo的文档:

  

value参数必须为null或Double的实例;除此以外,   抛出异常。 Double的任何实例,不管它是什么   value,被认为大于null。

示例中的value参数为null。因此NaN被视为大于null,这就是CompareTo正确返回1的原因。

答案 1 :(得分:2)

来自IComparable.CompareTo()上的MSDN文档:

  
    

根据定义,任何对象都比较大于(或跟随)null,并且两个空引用相互比较相等。

  

Double.CompareTo(object)文档中也可以看出这一点:

  
    

如果此实例大于value,则返回正整数。 - 或者 - 此实例是一个数字,值不是数字(NaN)。 - 或 - value是一个空引用(在Visual Basic中为Nothing)。

  

正如Adam Houldsworth所指出的,如果something.CompareTo(somethingElse)在somethingElse为null时抛出异常,那么排序和类似的事情将需要大量额外的异常处理。

答案 2 :(得分:2)

当您对CompareTo的{​​{1}}进行反编译时,您可以看到:

double

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