7

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

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

从我的角度来看,这没有任何意义。例外会更合适。

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

4

3 回答 3

4

CompareTo的文档中:

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

您的示例中的 value 参数是null. NaN因此被认为大于 null 这就是为什么CompareTo正确返回1.

于 2013-04-18T15:49:37.597 回答
2

从 MSDN 文档中IComparable.CompareTo()

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

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

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

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

于 2013-04-18T15:49:20.900 回答
2

反编译CompareTo的时候double可以看到:

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

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

于 2013-04-18T15:51:42.643 回答