为什么我不能使用IComparable在祖先类上并比较子类

本文关键字:祖先 子类 比较 不能 IComparable 为什么 | 更新日期: 2023-09-27 18:13:46

我试图使用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<T>的基类的子类?我可能遗漏了什么,但我不明白为什么不允许这样做。

编辑:应该澄清一下,我的目标是。net 3.5 (SharePoint 2010)

Edit2: . net 3.5是问题(见下面的答案)。

为什么我不能使用IComparable<T>在祖先类上并比较子类

我认为这是。net 4.0之前的。net版本;在。net 4.0之后,它是IComparable<in T>,在许多情况下应该可以正常工作-但这需要4.0中的方差变化

列表是List<Child> -所以排序它将尝试使用IComparable<Child>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);
    }
}

将通过object应用相同的逻辑。