2010-03-31 13 views
7

Ho una classe generica che accetta un tipo T. All'interno di questa classe Ho un metodo erano ho bisogno di confrontare un tipo a un altro tipo TT come ad esempio:Operatori di confronto binari su tipi generici

public class MyClass<T> 
{ 
    public T MaxValue 
    { 
     // Implimentation for MaxValue 
    } 

    public T MyMethod(T argument) 
    { 
     if(argument > this.MaxValue) 
     { 
      // Then do something 
     } 
    } 
} 

L'operazione di confronto all'interno del MyMethod non riesce con errore del compilatore CS0019. È possibile aggiungere un vincolo a T per farlo funzionare? Ho provato ad aggiungere un where T: IComparable<T> alla definizione della classe senza alcun risultato.

+0

È impossibile = (. Tuttavia c'è una libreria di matematica open source che prova ad affrontarlo, deve ricordare il nome ... – vittore

risposta

9

Aggiunta di un vincolo per assicurarsi che il tipo implementa IComparable<T> è un modo per andare. Tuttavia, non è possibile utilizzare l'operatore < - l'interfaccia fornisce un metodo CompareTo a fare la stessa cosa:

public class MyClass<T> where T : IComparable<T> { 
    public T MaxValue { 
     // Implimentation for MaxValue 
    } 

    public T MyMethod(T argument) { 
     if(argument.CompareTo(this.MaxValue) > 0){ 
      // Then do something 
     } 
    } 
} 

Se avete bisogno di altri operatori numerici di un semplice confronto, la situazione è più difficile, perché non è possibile aggiungere vincolo per supporto per l'operatore di esempio + e non esiste un'interfaccia corrispondente. Alcune idee su questo can be found here.

+0

Mi picchia. :) –

+0

Buona chiamata Tomas. Ho trovato un post sul blog all'indirizzo http://blogs.telerik.com/hristoborisov/posts/09-01-10/comparing_generic_types.aspx riguardo a questo problema esatto poco dopo che ho posto la domanda che conferma ciò che stai dicendo. –

3

No, non è possibile, i limiti dell'operatore non sono purtroppo consentiti in C#. where T: IComparable<T> dovrebbe funzionare bene, ma è necessario utilizzare altre semantiche: metodo CompareTo anziché>, < e operatori ==.

+0

Sì e non sono sicuro che l'OP sia sposata con l'uso di operatori per questo –

+0

Hmm..Non ho veramente capito il tuo commento – n535

+0

intendeva dire che l'OP non è obbligato a usare quegli operatori.Può usare in qualsiasi altro modo, anche se funziona a lungo .. –

2

È necessario utilizzare il metodo CompareTo .

1

In realtà, non è necessario niente di speciale qui. Comparer<T>.Default offre un metodo .Compare che farà tutto il necessario senza richiedere alcun vincolo generico aggiuntivo (che tende a propagarsi in modo orribile). Funziona sia per IComparable<T> e IComparable, e supporta classi, strutture e Nullable<T>. Lavoro fatto.

Per informazioni, questo è il modo in cui funzionano le implementazioni LINQ /Min e allo stesso modo List<T>.Sort. Quindi una parte comune e ben supportata del BCL.