13

我正在实施IComparableIComprable<T>在我的一门课程中。CompareTo当给定一个空参数时,对于每种情况下的方法应该如何表现,是否有任何建议?它应该返回一个正数还是抛出一个ArgumentNullException?或者这种行为会因实现类而异?

我看到了 MSDN 文档(这里这里),但在这个主题上没有什么可说的。任何帮助将不胜感激。

4

3 回答 3

14

两个 MSDN 参考IComparable.CompareTo()IComparable<T>.CompareTo()陈述了以下内容:

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

Nothing在 VB 中对应于null在 C# 中。

请注意,上一段指出:

比较“小于”、“等于”和“大于”的含义取决于特定的实现。

但是,无论您如何比较类的实例,非 null 的实例引用总是大于 null 引用。

于 2011-12-27T07:25:32.683 回答
12

我看到了 MSDN 文档,但在这个问题上没有什么可说的

是的,确实如此,但不是很清楚。该文档指出:

根据定义,任何对象比较大于(或遵循)Nothing,并且两个空引用比较彼此相等。

该文档令人困惑,因为它在同一个句子中混合了 C# (null) 和 VB (Nothing) 的习语。我会向文档经理提到它。

请注意,相同的规则适用于可为空的值类型。例如,如果您正在对可空整数列表进行排序,那么出于排序目的,1 被认为大于空。当心; 这不是 C# 中默认比较可空整数的方式。

于 2011-12-27T07:26:35.957 回答
8

确保用于Object.ReferenceEquals测试传递给的参数是否CompareTo为空。避免在方法中使用==!=运算符,CompareTo因为实际上有人可能会按照 MSDN 的建议将这些运算符委托给CompareTo方法,这反过来会创建无限循环和堆栈溢出(!)。

这是一个模型,您可以尝试如何实现一个CompareTo方法:

public class Piano : IComparable<Piano>
{
    public float Mark { get; set; }

    public int CompareTo(Piano other)
    {
        // The very basic implementation of CompareTo

        if (object.ReferenceEquals(other, null))
            return 1;   // All instances are greater than null

        return Mark.CompareTo(other.Mark);
    }
}

完整的源代码以及地址的解释。

于 2013-05-12T23:46:21.373 回答