2015-09-10 14 views
6

Ho una domanda sulla trasmissione a nullable enum. Ecco un codice:Trasmissione a enumerazione nullable

enum Digits 
{ 
    One = 1, 
    Two = 2 
} 

void Main() 
{ 
    int one = 1; 
    object obj = one; 
    var en = (Digits?) obj; 
    Console.WriteLine(en); 
} 

Mi dà InvalidCastException in linea # 11.
Ma se ometto '?' simbolo in quella linea, dà il risultato corretto "Uno" ma non voglio perdere "nullability".
Come soluzione temporanea ora utilizzo var en = (Digits?) (int?) obj; e funziona anche se non sono sicuro della completa correttezza di tale soluzione.

Ma mi chiedo perché il failover di enumerazione nullable non riesce nel primo caso?

Mi aspettavo che la fusione di tipi nullable agisce come segue:
- cast di tipo non annullabile, se il successo poi gettato al tipo nullable
- se null viene passato poi risultato sarebbe null così
Ma sembra non essere vero.

+5

vedi anche http://stackoverflow.com/questions/5199419/c-sharp-cast-object-of-type-int-to-nullable-enum – simonalexander2005

risposta

6

Si sta lavorando con in scatola valore int. Unbox di nuovo in int prima:

var en = (Digits?) (int) obj; // note "(int)" 

Se obj può essere assegnato a null è possibile utilizzare ternario operatore:

Digits? en = null == obj ? null : (Digits?) (int) obj; 
0

Prova questa:

Digits en; 
Enum.TryParse(obj.ToString(), out en); 
+2

where e è il nullable enum? La tua risposta è stata adatta alla domanda? – Xaruth

+1

'Cifre en; Cifre? risultato = Enum.TryParse (obj.ToString(), out en)? it: (cifre?) null; ' – Corak