2013-05-15 6 views
9

Sto cercando di ordinare una lista di oggetti usando List.Sort(), ma in fase di esecuzione mi dice che non può confrontare gli elementi nella matrice.Perché non posso utilizzare IComparable <T> nella classe di antenato e confrontare le classi figlio?

Impossibile confrontare due elementi dell'array

struttura di classe:

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." 

Perché non è possibile confrontare sottoclassi di una base che implementa IComparable<T>? Probabilmente mi manca qualcosa, ma non riesco a capire perché questo non dovrebbe essere permesso.

Edit: dovrebbe chiarire che ho scelto come target .NET 3.5 (SharePoint 2010)

Edit2: NET 3.5 è il problema (vedi risposta qui sotto).

+2

Poiché questa sembra essere un'eccezione di runtime, forse uno dei tuoi figli ha un 'Titolo' di null? O forse c'è un nulla nella tua lista? – nvoigt

+0

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

+3

Funziona per me con .NET 4 ma [** non su ideone **] (http: //ideone.com/rZ0rVL), quale versione di .NET stai usando? –

risposta

11

Presumo che questa sia una versione .NET precedente a .NET 4.0; dopo NET 4.0 è IComparable<in T>, e dovrebbe funzionare bene in molti casi - ma questo richiede i cambiamenti della varianza a 4.0

la lista è List<Child> - così l'ordinamento cercherà di utilizzare IComparable<Child> o IComparable - ma nessuno di questi è implementato. Si potrebbe implementare IComparable a livello Parent, forse:

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

che applicare la stessa logica via object.

+0

So che posso usare IComparable, ma voglio solo supportare il confronto tra due classi derivate da Parent. Dopo tutto, un genitore è un genitore quindi non capisco perché non lo possa semplicemente implementare come sopra. – Thomas

+0

Sì, ma perché non è possibile utilizzare il confronto classe genitore? Se fosse una funzione statica separata, sarebbe possibile. Il compilatore non dovrebbe cercare i comparatori di classe base? Potrebbe essere possibile, ma probabilmente non è implementato ... –

+0

In realtà, il codice funziona correttamente per me e per gli ordinamenti. Naturalmente non funziona se l'implementazione 'IComparable ' viene rimossa. * Aggiornamento *: È sicuramente dovuto a .NET 4. – Jon

Problemi correlati