IComparable和IComparable <T>

Mar*_*vez 34 .net c# icomparable

我应该实现两者IComparable和通用IComparable<T>吗?如果我只执行其中一个,是否有任何限制?

Ode*_*ded 21

是的,你应该实现这两个.

如果实现一个,任何依赖于另一个的代码都将失败.

有许多代码使用IComparableIComparable<T>不使用两者,因此实现两者都可以确保您的代码能够使用这些代码.

  • @David - 某些框架代码肯定会使用`IComparable`.我相信`Array.Sort`和`ArrayList.Sort`使用它. (5认同)
  • 好吧,多么令人失望.如果能够忘记非通用的.net曾经存在过,那将是美妙的. (4认同)
  • 是我还是第一句也是最后一句矛盾的? (2认同)
  • @Henk我看不出矛盾。 (2认同)
  • 我也看不出矛盾.最后一句重申,如果没有实现,代码可能会中断. (2认同)

Zor*_*vat 21

Oded是正确的,您应该实现它们,因为有集合和其他类只依赖于其中一个实现.

但是有一个技巧:IComparable <T>不应该抛出异常,而IComparable应该.在实施IComparable <T>时,您负责确保可以将T的所有实例相互比较.这也包括null(将null视为小于T的所有非null实例,你会没事的).

但是,一般IComparable接受System.Object并且您不能保证所有可想到的对象都可以与T的实例相比.因此,如果您将非T实例传递给IComparable,则只需抛出System.ArgumentException.否则,将调用路由到IComparable <T>实现.

这是一个例子:

public class Piano : IComparable<Piano>, IComparable
{
    public int CompareTo(Piano other) { ... }
    ...
    public int CompareTo(object obj)
    {

        if (obj != null && !(obj is Piano))
            throw new ArgumentException("Object must be of type Piano.");

        return CompareTo(obj as Piano);

    }
}
Run Code Online (Sandbox Code Playgroud)

这个例子是一篇更长篇文章的一部分,其中包含了在实现IComparable时应该注意的副作用的广泛分析<T>:如何在Base和派生类中实现IComparable <T>接口