C# 为什么我不能使用IComparable<;T>;关于祖先类和比较子类?

C# 为什么我不能使用IComparable<;T>;关于祖先类和比较子类?,c#,.net-3.5,icomparable,C#,.net 3.5,Icomparable,我试图使用list.sort()对对象列表进行排序,但在运行时它告诉我无法比较数组中的元素 无法比较数组中的两个元素 班级结构: public abstract class Parent : IComparable<Parent> { public string Title; public Parent(string title){this.Title = title;} public int CompareTo(Parent other){

我试图使用
list.sort(
)对对象列表进行排序,但在运行时它告诉我无法比较数组中的元素

无法比较数组中的两个元素

班级结构:

public abstract class Parent : IComparable<Parent> {
    public string Title;
    public Parent(string title){this.Title = title;}

    public int CompareTo(Parent other){
        return this.Title.CompareTo(other.Title);
    }
}

public class Child : Parent {
    public Child(string title):base(title){}
}

List<Child> children = GetChildren();
children.Sort(); //Fails with "Failed to compare two elements in the array."
公共抽象类父类:IComparable{
公共字符串标题;
公共父项(字符串标题){this.title=title;}
公共整数比较(父级其他){
将此.Title.CompareTo返回(其他.Title);
}
}
公共类子级:父级{
公共子(字符串标题):基(标题){}
}
List children=GetChildren();
children.Sort()//因“无法比较数组中的两个元素”而失败
为什么我不能比较实现
IComparable
的基的子类?我可能遗漏了什么,但我不明白为什么不允许这样做

编辑:应该澄清我的目标是.NET3.5(SharePoint 2010)


Edit2:.NET3.5是问题所在(请参见下面的答案)。

我假设这是.NET4.0之前的.NET版本;在.NET4.0之后,它是可比较的,在许多情况下应该可以正常工作,但这需要在4.0中进行差异更改

列表是
list
,因此排序时会尝试使用
IComparable
IComparable
,但这两种方法都没有实现。您可以在
Parent
级别实现
IComparable
,也许:

public abstract class Parent : IComparable<Parent>, IComparable {
    public string Title;
    public Parent(string title){this.Title = title;}

    int IComparable.CompareTo(object other) {
        return CompareTo((Parent)other);
    }
    public int CompareTo(Parent other){
        return this.Title.CompareTo(other.Title);
    }
}
公共抽象类父类:IComparable,IComparable{
公共字符串标题;
公共父项(字符串标题){this.title=title;}
int IComparable.CompareTo(对象其他){
返回CompareTo((父)其他);
}
公共整数比较(父级其他){
将此.Title.CompareTo返回(其他.Title);
}
}

这将通过
对象

应用相同的逻辑,因为这似乎是运行时异常,可能您的一个孩子的
标题
为null?或者你的列表中有一个空值?它适用于我使用.NET 4,但是,你使用的是什么.NET版本?在简单地填充
子类之后就可以了。这也适用于我…我知道我可以使用IComparable,但我真的只想支持比较从父类派生的两个类。在这里,Child毕竟是一个父类,所以我不明白为什么我不能像上面那样简单地实现它。是的,但是为什么不能使用父类比较器呢?如果它是独立的静态函数,那么它是可能的。编译器不应该搜索基类比较器吗?这应该是可能的,但可能没有实现……事实上,代码对我来说是有效的,并且排序正确。当然,如果删除了
IComparable
实现,它就不起作用。更新:这肯定是由于.NET4造成的。@Thomas我想你的目标是.NET4.0之前的东西?从4.0开始,差异规则得到了改进-但在4.0之前,这是不可原谅的,谢谢!我将此标记为正确,因为它解释了一种解决方法以及为什么它不适合我。很高兴知道这在.NET4.0+中有效。