为什么下面的代码片段返回 1:
double i = double.NaN;
double? i2 = null;
i.CompareTo(i2);
从我的角度来看,这没有任何意义。例外会更合适。
你认为这个决定背后的原因是什么。
为什么下面的代码片段返回 1:
double i = double.NaN;
double? i2 = null;
i.CompareTo(i2);
从我的角度来看,这没有任何意义。例外会更合适。
你认为这个决定背后的原因是什么。
从CompareTo的文档中:
value 参数必须为 null 或 Double 的实例;否则,抛出异常。Double 的任何实例,无论其值如何,都被视为大于 null。
您的示例中的 value 参数是null
. NaN
因此被认为大于 null 这就是为什么CompareTo
正确返回1
.
从 MSDN 文档中IComparable.CompareTo()
:
根据定义,任何对象比较大于(或跟随)null,并且两个 null 引用比较彼此相等。
这在文档中也很明显Double.CompareTo(object)
:
如果此实例大于值,则返回一个正整数。- 或 - 此实例是一个数字,而值不是一个数字 (NaN)。- 或 - value 是一个空引用(在 Visual Basic 中为 Nothing)。
正如 Adam Houldsworth 指出的那样,如果something.CompareTo(somethingElse)
在 somethingElse 为空时抛出异常,那么排序和类似的事情将需要大量额外的异常处理。
反编译CompareTo
的时候double
可以看到:
public int CompareTo(object value)
{
if (value == null)
return 1;
只是将空元素放在任何排序序列的底部。