空参数的行为是不可比较的

本文关键字:可比较 参数 | 更新日期: 2023-09-27 18:18:47

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

我看到了MSDN文档(这里和这里),但它没有说这个主题。

空参数的行为是不可比较的

MSDN对IComparable.CompareTo()IComparable<T>.CompareTo()的引用如下:

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

VB中的Nothing对应c#中的null

注意前一段说:

比较"小于"、"等于"answers"大于"的含义取决于特定的实现。

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

我看了MSDN文档,但是它没有提到这个主题

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

根据定义,任何对象都比Nothing大(或在Nothing之后),并且两个null引用相互比较相等。

文档令人困惑,因为它在同一个句子中混合了c# (null)和VB (Nothing)的习惯用法。我要向文档经理提一下。

注意,同样的规则也适用于可空值类型。如果您正在排序一个可为空的整数列表,那么为了排序的目的,1被认为大于null。小心;

确保使用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);
    }
}

完整的源代码,并解释了这个地址