继承自实现IComparable <T>的东西时,C#BinarySearch会中断吗?

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)似乎不起作用.

Kob*_*obi 7

文档清楚地说明了这一点:

检查类型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>,并且发布的代码按预期工作.

  • 逆变FTW! (5认同)