2010-11-05 7 views
13

Voglio limitare i possibili tipi che N può assumere usando un vincolo. Desidero limitare N a essere int o decimale.Come limitare T ai tipi di valore utilizzando un vincolo?

public static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : int, decimal 
{ 
    // Do stuff here 
} 

Qualsiasi aiuto apprezzato ...

+1

Se questi sono gli unici due tipi che ti interessano, penso che potresti semplicemente sovraccaricare il metodo. Certo sono 4 sovraccarichi ma non è male. –

risposta

7

Perché non basta fare questo:

public static Chart PopulateInto<T>(List<T> yAxis, List<int> xAxis) 
{ 
    // Do stuff here 
} 

public static Chart PopulateInto<T>(List<T> yAxis, List<decimal> xAxis) 
{ 
    // Do stuff here 
} 
+1

L'ho fatto in origine, ma spero in qualcosa di kewler –

+10

imo, evita 'kewl' e rimani leggibile/corretto. – Marc

+0

E i miei farmaci generici sono spenti, è quello che ottengo per scrivere risposte venerdì sera, lascia che corregga. –

13

Non è possibile vincolare un parametro generico a uno specifico tipo di valore.

È possibile tuttavia forzare per essere un tipo di valore ostruct aggiungendo where N : struct, ma questo è tutto.

+1

Un modo alternativo per gestirlo è di avere sovraccarichi specifici per gli elenchi 'int' o' decimal'. –

6

Non v'è alcun modo per farlo con un vincolo. Un altro approccio, supponendo che PopulateInto possa funzionare con una N generica, è quello di rendere il nucleo algorihtm generico e privato e offrire 2 sovraccarichi pubblici che prendono rispettivamente uno int e decimal. Questo creerà un effetto simile

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<decimal> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<int> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

private static Chart PopulateIntoCore<T, N>(
    List<T> yAxis, 
    List<N> xAxis) where N : struct { 
    ... 
} 
+0

Le prime due dovrebbero essere pubbliche, corrette? ;-) –

+1

@ Mark, si, sarebbe il punto cruciale della mia risposta;) Risolto – JaredPar

2

Come ha detto Pieter, non è possibile utilizzare un controllo in fase di compilazione per questo. Tuttavia, è possibile eseguire quanto segue in fase di esecuzione:

if(!(typeof(N).equals(typeof(int32))) && !(typeof(N).equals(typeof(decimal)))) 
    // do something 
+1

Sì, perché no. Getta una InvalidOperationException. –

Problemi correlati