覆盖CompareTo:如何处理null case?

时间:2013-06-10 14:11:14

标签: c# compareto

当给定对象为CompareTo时,null方法应返回什么内容?

MSDN Library显示了返回1的示例。但我希望抛出一个错误,因为与null进行比较是不可能的。

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

4 个答案:

答案 0 :(得分:31)

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

IComparable<T>.CompareToIComparable.CompareTo的MSDN文档中给出了正确答案:

  

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

(合同中,比较更大的定义为:if a > b然后a.CompareTo(b) > 0。)

此预期行为也在例如Nullable.Compare<T>中得到证实。 Null始终比较小于值。

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

  

参数 obj 必须与类或值类型相同   实现这个接口;否则,ArgumentException是   抛出。


这不会对您的问题产生影响,但请注意, Nullable<T> comparison operators==!=<<=>>=)不遵循IComparable惯例

  

当您与可空类型进行比较时,如果值为1   可以为空的类型是null,而另一个不是,所有的比较   评估为false!=除外(不等于)。重要的是不要   假设因为特定的比较返回false,所以   相反的情况返回true。在以下示例中,10不是   大于,小于,等于null。只有1个}}   评估为num1 != num2

还有一个奇怪的结果,true评估为真,但(int?)null == (int?)null没有。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

最佳做法取决于您的具体情况:根据您要比较的对象,可能会与null进行比较。

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

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

答案 3 :(得分:-1)

使用null参数的CompareTo会影响使用空项目排序列表时的情况。通过在给定对象为null时返回1,在排序时使null出现在列表顶部,这是最受欢迎的行为。