25

CompareTo当给定对象是时,方法中应该返回什么null

MSDN 库显示了返回的示例1。但我本以为会抛出错误,因为null无法进行比较。

我希望对这个答案有不同的看法。什么是最佳实践方法?

4

4 回答 4

43

是的,有一个最佳实践。与其他答案所说的相反,有一个预期的标准,而不仅仅是最受欢迎的行为。

正确答案在 MSDN 文档中给出了IComparable<T>.CompareToand IComparable.CompareTo

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

(合同上,比较更大的定义为:如果a > b那么a.CompareTo(b) > 0。)

例如,这种预期的行为也得到了证实Nullable.Compare<T>。Null 总是比较小于一个值。

还值得注意的是,对于非泛型比较,不匹配的类型不应被视为 null:

参数obj必须与实现此接口的类或值类型相同;否则,将引发 ArgumentException。


这不会影响您的问题,但请注意,Nullable<T> comparison operators( ==, !=, <, <=, >, >=) 不遵循IComparable约定

当您对可空类型执行比较时,如果可空类型之一的值为 null 而另一个不是,则所有比较的结果都为falseexcept for !=(不等于)。重要的是不要假设因为特定的比较返回false,相反的情况会返回true。在以下示例中,10 不大于、小于或等于 null。仅num1 != num2 计算为true

还有一个奇怪的结果,(int?)null == (int?)null计算结果为真但(int?)null <= (int?)null不是。

于 2014-05-21T15:12:26.933 回答
2

这是你的选择。想象一个有效的用例并没有超出可能的范围,在这个用例中我会将某物与无物进行比较,并希望“某物”被视为更大。但这就是为什么您要覆盖它,因此您可以决定如何处理这种情况。

于 2013-06-10T14:14:11.120 回答
1

最佳实践将取决于您的特定情况:null根据您要比较的对象,比较可能是可能的。

如果我将我的对象定义null为任何比较的最低值,那么比较null显然是可能的并且具有明确定义的结果。在其他情况下,抛出异常可能更有意义。

最终,这是一个(相当主观的)设计问题,不一定有一个答案。

于 2013-06-10T14:15:47.020 回答
0

带有 null 参数的 CompareTo 会影响对具有 null 项的列表进行排序时的情况。通过在给定对象为 null 时返回 1,使 null 在排序时出现在列表顶部,这是最流行的行为。

于 2013-06-10T14:16:32.367 回答