2016-11-30 6 views
4

Ich habe eine Aufzählung und eine switch-Anweisung auf dieser ENUM basiert, die wie folgt aussieht:Aufzählungen mit und ohne Werte

public enum MyEnum 
    { 
     VAL1, 
     VAL2, 
     VAL3, 
     ONE = 1, 
     TWO = 2 
    } 

und den Schalter:

switch ((MyEnum)Enum.Parse(typeof(MyEnum), input.ToUpper())) 
     { 
      case MyEnum.VAL1: 
       Console.WriteLine("val1"); 
       break; 
      case MyEnum.VAL2: 
       Console.WriteLine("val2"); 
       break; 
      case MyEnum.VAL3: 
       Console.WriteLine("val3"); 
       break; 
      case MyEnum.ONE: 
       Console.WriteLine("1"); 
       break; 
      default: 
       Console.WriteLine("default"); 
       break; 
     } 

wo Eingang ist eine Zeichenfolge. Das Problem, das ich habe ist, dass ich einen Compiler-Fehler haben,

Das Label 'Fall 1:' kommt bereits in der switch-Anweisung

Ich fand, dass die Bewegung des 'ONE' Element als erste in Die Aufzählung löst das Problem, aber meine Frage ist warum dies passiert?

+3

'VAL2' und' ONE' sind gleiche –

+0

Wenn Sie dies im Debugger ausführen, was ist der Integer-Wert von Val1, Val2 & Val3? –

+1

@MartinVerjans OP kann dies natürlich nicht im Debugger ausführen, da es einfach nicht kompiliert wird. – HimBromBeere

Antwort

6

Nun denn, was passiert ist, wenn Sie haben:

public enum MyEnum 
    { 
     VAL1, 
     VAL2, 
     VAL3, 
     ONE = 1, 
     TWO = 2 
    } 

Sie im Grunde haben:

public enum MyEnum 
    { 
     VAL1 = 0, 
     VAL2 = 1, 
     VAL3 = 2, 
     ONE = 1, 
     TWO = 2 
    } 

Sie sehen, wo Ihr Problem ist, jetzt? Sie müssen ihnen unterschiedliche Werte zuweisen.

1

VAL2 haben den Wert 1 (da es nur nach VAL1 platziert ist, die den Wert nimmt 0). Dies entspricht dem Wert, den Sie für ONE festgelegt haben.

Die Gehäuselabels in einer switch müssen unterschiedliche Werte haben: das ist daher in Ihrem Fall nicht wahr, so Kompilierung fehlschlägt.

(Wenn Sie die Dinge mischen um so ONE und TWO am Start sind, dann würde VAL2 den Wert 4, und das Problem verschwindet, wie Sie beachten).

0

Wenn ich mich nicht irre sein, weil Val2 würde 1 sein, wie es der zweite Enum ist, und sie sind Null basiert, und Sie haben ein anderes als „1“ definiert (One). Wenn Sie also "Eins" nach oben bewegen, ändert sich die Reihenfolge, daher verschwindet das Problem.

1

Aufzählungen in C# sind einfach Lust auf ganze Zahlen. Wenn Sie den Wert für einen Aufzählungswert nicht explizit angeben, weist der Compiler automatisch einen Wert zu. Also, wenn MyEnum.VAL2 verarbeitet wird, wird der Wert zugewiesen 1 wie es der zweite Wert ist. Dann kommt MyEnum.ONE und nimmt auch den Wert 1. In dem Schalter bewirkt dies sowohl MyEnum.VAL2 und MyEnum.ONE den Wert haben 1 und da einen Schalter kann nur einen Wert einmal, dies führt zu einem Compiler-Fehler. Wie Sie bereits herausgefunden, einfach mit explizit angegebenen Werte an die Spitze der ENUM-Werte bewegen löst das Problem als der Wert 1 kann dann als ‚genommen‘ behandelt werden.

+0

Ich glaube, es beginnt tatsächlich bei 0 für val1. Siehe andere Antworten –

+0

@DavidBenKnoble Ich glaube, du hast Recht, habe C# in ein paar Monaten nicht verwendet und Java hat diese enum ganzzahlige verrückte Magie nicht. Ich habe meine Antwort entsprechend korrigiert. –

1

Wenn eine neue Enumeration zu schaffen, sind die Optionen tatsächlich Zahlen. Wenn Sie für eine enum-Option keinen bestimmten numerischen Wert definieren, setzt der Compiler den Wert standardmäßig in aufsteigender Reihenfolge (0,1,2, ...). Deshalb ist VAL1 = 0, VAL2 = 1 und VAL3 = 2. Dann setzen Sie einen Wert auf ONE = 1 und TWO = 2 und Sie müssen unterschiedliche Namen für die gleiche Option haben (VAL2 = ONE = 1 und VAL3 = TWO = 2). eine einfache Konsolenanwendung zeigt es: example

Verwandte Themen