Mar*_*vez 34 .net c# icomparable
我应该实现两者IComparable和通用IComparable<T>吗?如果我只执行其中一个,是否有任何限制?
Ode*_*ded 21
是的,你应该实现这两个.
如果实现一个,任何依赖于另一个的代码都将失败.
有许多代码使用IComparable或IComparable<T>不使用两者,因此实现两者都可以确保您的代码能够使用这些代码.
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>接口