null参数的IComparable行为

时间:2011-12-27 07:19:24

标签: c# .net icomparable

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

我看过MSDN文档(herehere),但对此主题没什么好说的。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:12)

  

我看过MSDN文档,但在这个主题上没有什么可说的

是的,但不是很清楚。文档说明:

  

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

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

请注意,相同的规则适用于可空值类型。如果要对可空整数列表进行排序,比如说,为了排序,则认为1大于null。小心;这不是C#中默认的可空整数比较。

答案 1 :(得分:7)

确保使用Object.ReferenceEquals来测试传递给CompareTo的参数是否为null。避免在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);

    }

}

包含this地址解释的完整源代码。