End*_*der 5 c# sorting generics inheritance interface
在.NET中,如果您尝试搜索的项目从IComparable继承而不是直接实现,则BinarySearch算法(在列表,数组等中)似乎会失败:
List<B> foo = new List<B>(); // B inherits from A, which implements IComparable<A>
foo.Add(new B());
foo.BinarySearch(new B()); // InvalidOperationException, "Failed to compare two elements in the array."
Run Code Online (Sandbox Code Playgroud)
哪里:
public abstract class A : IComparable<A>
{
public int x;
public int CompareTo(A other)
{
return x.CompareTo(other.x);
}
}
public class B : A {}
Run Code Online (Sandbox Code Playgroud)
有没有解决的办法?在B类中实现CompareTo(B other)似乎不起作用.
文档清楚地说明了这一点:
检查类型T是否实现IComparable通用接口并使用该实现(如果可用).如果不是,Comparer.Default检查类型T是否实现IComparable接口.如果类型T未实现任一接口,则Comparer.Default会抛出InvalidOperationException.
因此,一个简单的解决方案是实现非通用接口IComparable.
添加CompareTo(B other) 会为你工作,只要你还实现了IComparable<B>-你可能忘记了一点.
一个有趣的解决方案是使用C#4编译代码,它运行时没有任何错误.C#4引入了通用协方差:public interface IComparable<in T>vs public interface IComparable<T>,并且发布的代码按预期工作.
| 归档时间: |
|
| 查看次数: |
810 次 |
| 最近记录: |