9

)を使用してオブジェクトのリストを並べ替えようとしてList.Sort(いますが、実行時に配列内の要素を比較できないことがわかります。

配列内の 2 つの要素を比較できませんでした

クラス構造:

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 が問題です (以下の回答を参照)。

4

1 に答える 1

11

これは .NET 4.0 より前の .NET バージョンだと思います。.NET 4.0 以降はIComparable<in T>であり、多くの場合は問題なく動作するはずですが、これには 4.0 での差異の変更が必要です

リストはList<Child>- ソートすると、IComparable<Child>またはIComparable- のいずれかを使用しようとしますが、どちらも実装されていません。おそらく次IComparableのレベルで実装できます。Parent

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

于 2013-05-15T11:39:34.773 に答える