2011-09-04 10 views
6

Come funziona la seguente estensione? Sto vincolando il ComboBoxe a un enum e in questo caso non si compila perché restituisce null.Come rendere un metodo generico consentire di restituire null e accettare enum?

public static T GetSelectedValue<T>(this ComboBox control) 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 

Nota: lo voglio restituire null (invece di default (T)). La domanda è: qual è l'espressione in cui devo usare?

+0

post seguente risponde alla tua domanda riguardante il ritorno di null dal metodo generico: http://stackoverflow.com/questions/302096/how-can-i-return-null-from-a-generic-method-in-c – Waqas

risposta

5

Return un nullable invece di una pianura T:

public static T? GetSelectedValue<T>(this ComboBox control) where T : struct 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 
5

Impossibile. I tipi di valore non possono essere nulli. Il tuo metodo di estensione restituisce un'istanza di T e se questa T è una enum (tipo di valore), il suo valore non può essere nullo. Quindi, senza modificare il tipo di ritorno, tale firma del metodo semplicemente non può esistere. Per quanto riguarda il vincolo del parametro generico per essere un enum, ciò è anche impossibile in C# ma è possibile in MSIL. Jon ha blogged about it.

+0

cosa se ha restituito il valore predefinito anziché null? – Tim

+0

@Tim, certo che funzionerà e il modo corretto di scrivere questo metodo di estensione ma l'OP lo sa già perché l'ha menzionato nella sua domanda. Ho solo cercato di spiegargli che la firma del metodo generico che sta cercando di scrivere semplicemente non può esistere. –

+0

@Darin: Grazie per la risposta, nel mio caso, il suggerimento a cui è stato risposto Konrad utile. –

1

L'approccio più comune in questo caso è tra tutti gli altri membri della tua enumerazione definiscono None, in questo caso nella logica None == null.

+0

Sì, è utile, penso che sia OK semplicemente assegnando il valore "0" a "Nessuno" e l'estensione restituisce "default" (T) " –

+0

@French Boy: questo è semplice e leggibile, quindi il modo più naturale di risolverlo tipo di problemi. – Tigran

Problemi correlati