Collections IComparer<&燃气轮机;C语言中的类继承#

Collections IComparer<&燃气轮机;C语言中的类继承#,collections,.net-2.0,c#-2.0,Collections,.net 2.0,C# 2.0,有没有办法为基类类型实现专门的IComparer,以便子类仍然可以使用它在特定集合中进行排序 范例 public class A { public int X; } public class B:A { public int Y; } public AComparer:IComparer<A> { int Compare(A p1, A p2) { //... } } 公共A类 { 公共int X; } B级:A级 { 公共

有没有办法为基类类型实现专门的IComparer,以便子类仍然可以使用它在特定集合中进行排序

范例

public class A
{
   public int X;
}

public class B:A
{
   public int Y;
}

public AComparer:IComparer<A>
{
    int Compare(A p1, A p2)
    {
        //...
    }

}
公共A类
{
公共int X;
}
B级:A级
{
公共智力;
}
公共比较人:I比较人
{
整数比较(一个p1,一个p2)
{
//...
}
}
因此,以下代码将起作用:

List<A> aList = new List<A>();
aList.Sort(new AComparer());

List<B> bList = new List<B>();
bList.Sort(new AComparer()); // <- this line fails due to type cast issues 
List aList=newlist();
list.Sort(新的AComparer());
List bList=新列表();

bList.Sort(新的AComparer());// 首先,请注意,在.NET4中,这是通过泛型逆变修复的-您的代码可以简单地工作。编辑:如注释中所述,CLR v2首先支持通用变量,但各种接口和委托在.NET 4中只成为协变或逆变

但是,在.NET 2中,创建转换器仍然相当容易:

public class ComparerConverter<TBase, TChild> : IComparer<TChild>
    where TChild : TBase
{
    private readonly IComparer<TBase> comparer;

    public ComparerConverter(IComparer<TBase> comparer)
    {
        this.comparer = comparer;
    }

    public int Compare(TChild x, TChild y)
    {
        return comparer.Compare(x, y);
    }
}
然后你可以使用:

bList.Sort(new AComparer<B>());
bList.Sort(新的AComparer());

当然,这意味着要使所有比较器实现通用化,这在我看来有点难看。

效果很好,但问题是它将执行委托给基类比较器,但仍会改变调用方式。如果没有更好的方法,我将遵循这个方法。不幸的是,我不能使用.NET4。0@Random:我添加了另一个选项。非常感谢。这两种方法都非常有用,但都很难看:)我将坚持第一种选择,并让我的类负责公开比较器(实践可以在MSDN上找到)。这就是我将如何为其他开发人员提供通用的实现方式,至少是这样。@jonsket是.NET4的一个特性吗?我猜应该是C#…@nawfal:通用协方差是CLR v2、C#v4的一个特性,并在.NET4的框架库中引入。我还没有尝试过,但我认为在使用(比如)VS2010和瞄准.NET2时,应该可以引入您自己的变体接口/委托。。。但是在这种情况下,
IEnumerable
不会是协变的。
public class AComparer<T> : IComparer<T> where T : A
{
    int Compare(T p1, T p2)
    {
        // You can still access members of A here
    }    
}
bList.Sort(new AComparer<B>());