2013-06-06 11 views
8

Nehmen Sie dieses Stück Code:C# enum - Warum funktioniert * implizites * Casting von 0?

enum En { 
    val1, 
    val2, 
} 

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

Natürlich scheitert es, wenn 1 zu einer enum Variable vom Typ zuweisen. (Schlag einen expliziten Cast und es wird funktionieren.)

Meine Frage ist: Warum scheitert es nicht, wenn 0 zuweisen?

+1

** Duplizieren ** von [Warum Switch für Enum akzeptiert implizite Konvertierung zu 0, aber nein für andere Integer?] (Http://StackOverflow.com/questions/14950750/why-switch-for-enum-accepts- implicit-conversion-to-0-aber-for-any-any-intege) ** und ** [Compiler Werttyp Auflösung und Hardcoded "0" Integer-Werte] (http://stackoverflow.com/questions/14224465/Compiler-Werttyp-Auflösung-und-hardcoded-0-Integer-Werte). –

+0

bestimmte dupe, kurze antwort, weil es so ist. – Jodrell

+0

Wenn der Wert des ersten Aufzählungselements in der Deklaration nicht festgelegt ist, ist der Wert 0. http://msdn.microsoft.com/en-us/library/ms182149(v=vs.100).aspx –

Antwort

9

es so ist, weil das ist, was die Spezifikation sagt ...

Dies ist ein weiterer Grund, warum es immer eine gute Idee, alle Ihre Aufzählungen mit dem Wert 0, ‚ein Element zu geben, weil du sie bekommen sind wahrscheinlich manchmal mit diesem Wert.


der entsprechende Abschnitt in der Sprache C# spec 6.1.3:

6.1.3 Implicit Enumeration Konvertierungen

Eine implizite Enumeration Umwandlung erlaubt die dezimale ganzzahlige-Literal 0 bis in einen Enum-Typ und in einen beliebigen NULL-Typ konvertiert werden, dessen zugrunde liegender Typ ein Enum-Typ ist. Im letzteren Fall wird die Konvertierung ausgewertet, indem in den zugrunde liegenden Enum-Typ konvertiert und das Ergebnis umschlossen wird (§ 4.1.10).

Was warum es auf diese Weise - na ja, ich denke, nur jemand auf die Sprache Komitee, das diese Dinge entscheidet kennen würde.

In der Tat haben wir etwas wie das, wenn Sie auf die ursprüngliche Frage von rawlings Kommentar schauen.

+2

Kannst du das erweitern? –

+1

Ich sehe nicht, wie dies die Frage beantwortet. Die Standardinitialisierung hat nichts mit dem Compiler zu tun, der 'myEnum = 0' im Code erlaubt 0 'zu einer Struktur, aber sie werden immer noch standardmäßig initialisiert.Sie ​​können' 0 'keinem 'bool' zuweisen, aber sie werden immernoch initialisiert initialisiert. – Rawling

+1

@Rawling Guter Punkt, ich werde admend –

1

Der Grund, warum Sie 0 nur implizit verwenden können, ist, weil 0 immer ein gültiger enum Typ ist, wobei 1,2,3 oder eine andere Zahl nicht unbedingt ein gültiger Typ sein muss. Zum Beispiel versuchen, diese

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

0 noch ein gültiger enum Typ ist, weil 0 ist die Standardeinstellung, egal was Sie tun. Das heißt, wenn Sie einen Ihrer Werte nicht gleich 0 setzen, wird ein 0 enum Typ für Sie generiert.