2013-06-06 15 views
8

prendere questo pezzo di codice:enum C# - perché * il cast implicito * da 0 funziona?

enum En { 
    val1, 
    val2, 
} 

void Main() 
{ 
    En plop = 1; //error: Cannot implicitly convert type 'int' to 'En' 
    En woop = 0; //no error 
} 

Naturalmente non riesce quando si assegna 1 ad una variabile di tipo enum. (Slap un cast esplicito e funzionerà.)

La mia domanda è: perché NON fallisce quando si assegna 0?

+1

** Duplicato ** di [Perché passare a enum accetta la conversione implicita a 0 ma non per qualsiasi altro intero?] (Http://stackoverflow.com/questions/14950750/why-switch-for-enum-accetti- conversione implicita-a-0-ma-no-per-qualsiasi-altro-intege) ** e ** [Risoluzione del valore del valore del compilatore e valori interi "0" codificati in modo rigido] (http://stackoverflow.com/questions/14224465/compilatore-value-type-resolution-and-0-interi valori hardcoded-). –

+0

dupe definito, risposta breve, perché lo fa. – Jodrell

+0

per impostazione predefinita, se il valore del primo membro di enumerazione non è impostato nella dichiarazione, il suo valore è zero. http://msdn.microsoft.com/en-us/library/ms182149(v=vs.100).aspx –

risposta

9

E 'in questo modo perché è quello che dice lo spec ...

Questo è un altro motivo per cui è sempre una buona idea per dare a tutti i tuoi enumerazioni un elemento con il valore 0, 'cos è molto probabile che farli con quel valore a volte.


La sezione appropriata nel linguaggio C# spec 6.1.3:

6.1.3 implicita La conversione di enumerazione

una conversione enumerazione implicita permessi decimale integer letterale 0 essere convertiti in qualsiasi tipo enum e in qualsiasi tipo nullable il cui tipo sottostante sia di tipo enum. In quest'ultimo caso, la conversione viene valutata convertendo il tipo di enum sottostante e avvolgendo il risultato (§4.1.10).

Per quanto riguarda il motivo per cui E 'in questo modo - beh, credo solo che qualcuno del comitato linguaggio che decide queste cose avrebbero saputo.

In effetti, abbiamo qualcosa di simile se si guarda il commento di Rawling alla domanda originale.

+2

Puoi approfondire? –

+1

Non vedo come questo risponda alla domanda L'inizializzazione predefinita non ha nulla a che fare con il compilatore che consente 'myEnum = 0' nel codice. 0' a una struttura ma vengono ancora inizializzati di default.Non è possibile assegnare '0' a un' bool', ma vengono comunque inizializzati di default – Rawling

+1

@Rawling Buon punto, ammetto –

1

Il motivo per cui è possibile utilizzare solo implicitamente 0 è perché 0 sarà sempre un tipo valido enum in cui 1,2,3 o qualsiasi altro numero potrebbe non essere necessariamente un tipo valido. Per esempio provare questo

enum En { 
val1=1, 
val2=2, 
} 

0 è ancora un enum tipo valido perché 0 è il valore predefinito, non importa quello che fai. Il che significa che se non permetti a uno dei tuoi valori di essere uguale a 0, genererà un tipo 0 enum per te.

Problemi correlati