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

C# 比较NaN和null返回不合逻辑的值,c#,C#,为什么以下代码段返回1: double i = double.NaN; double? i2 = null; i.CompareTo(i2); 在我看来,这毫无意义。 例外情况更合适 您认为这一决定背后的原因是什么。来自IComparable.CompareTo()上的MSDN文档: 根据定义,任何对象的比较值都大于(或遵循)null,并且两个null引用的比较值相等 这在Double.CompareTo(object)文档中也很明显: 如果此实例大于值,则返回正整数-或-此实例是数字,而值不

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

double i = double.NaN;
double? i2 = null;
i.CompareTo(i2);
在我看来,这毫无意义。 例外情况更合适


您认为这一决定背后的原因是什么。

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

根据定义,任何对象的比较值都大于(或遵循)null,并且两个null引用的比较值相等

这在
Double.CompareTo(object)
文档中也很明显:

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

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

来自以下文档:

value参数必须为null或Double的实例;否则,, 将引发异常。Double的任何实例,无论其 值,则被视为大于null


示例中的value参数是
null
<因此,code>NaN被认为大于null,这就是为什么
CompareTo
正确返回
1
当您反编译
double
CompareTo
时,您可以看到:

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

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

排序时,它会强制所有null和nan位于列表的顶部或底部。对null和nan排序的“意义”与您所说的完全一样:一种观点。我想处理这个比较安全,因为
IComparer/IComparable
在后台驱动了很多东西,而且如果用户想要不同的行为,大部分时间都可以被用户覆盖。有总比没有好。