2013-05-15 17 views
9

List.Sort(を使用してオブジェクトのリストをソートしようとしていますが、実行時に配列の要素を比較できないことがわかります。祖先クラスでIComparable <T>を使用し、子クラスを比較できないのはなぜですか?

は、アレイ

クラス構造体に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>を実装ベースのサブクラスを比較することはできませんか?私はおそらく何かが不足していますが、なぜこれが許されてはならないのか分かりません。

編集:私はする(SharePoint 2010)

EDIT2 .NET 3.5をターゲットにしていますことを明確にすべき:.NET 3.5が問題である(下記答えを参照)。

+2

これはランタイムの例外と思われるため、子供の1人が 'Title'ヌルを持っている可能性があります。それとも、あなたのリストにnullがありますか? – nvoigt

+0

http://stackoverflow.com/questions/1658661/failed-to-compare-two-elements-in-the-array –

+3

.NET 4では動作しますが[ideon **ではありません](http: //ideone.com/rZ0rVL)、.NET版は何を使用していますか? –

答えて

11

.NET 4.0より前のバージョンです。 .NET 4.0の後にそれがIComparable<in T>あり、多くの場合、[OK]を動作するはずです - しかし、これはリストがList<Child>で4.0

の分散を変更する必要が - それはIComparable<Child>またはIComparableのいずれかを使用しようとソート - しかし、これらのいずれでもありません実装されました。あなたはおそらく、ParentレベルでIComparableを実現することができます。object経由で同じロジックを適用します

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); 
    } 
} 

を。

+0

私はIComparableを使うことができますが、実際にはParentから派生した2つのクラスの比較をサポートしたいだけです。子どもはすべてここに親がいるので、私はなぜ単に私は上記のようにそれを実装することはできません理解していない。 – Thomas

+0

はい、親クラスの比較機能を使用できないのはなぜですか?別個の静的機能であれば可能です。コンパイラーはベースクラスの比較演算子を検索するべきではありませんか?それは可能かもしれませんが、おそらく実装されていません... –

+0

実際には、コードは私のために動作し、正しく並べ替えます。 IComparable の実装が削除されても、それはうまく動作しません。 *アップデート*:確かに.NET 4のためです。 – Jon

関連する問題