2009-03-11 27 views
7

Wenn Sie in C# eine Enumeration deklarieren, ist der Standardtyp automatisch int.C# Enums und Casting

Also warum in einer case-Anweisung oder anderen Instanzen, wenn Sie die enum verwenden, müssen Sie explizit umschreiben, um die Werte zu verwenden? Was ist der Grund dafür, einen zugrunde liegenden Typ zu haben, wenn du explizit etwas sagen musst oder mache ich hier nur etwas falsch?

private enum MyEnum 
     { 
      Value1, 
      Value2, 
      Value3 
     } 

    switch (somevalue) 
       { 
        case (int)MyEnum.Value1: 
         someothervar = "ss"; 
         break; 
        case (int)MyEnum.Value2: 
         someothervar = "yy"; 
         break; 
        case (int)MyEnum.Value3: 
         someothervar = "gg"; 
         break; 
       } 
+0

Diese Code-Snippets sehen ein bisschen ackward aus. Sie definieren eine enum und der eingehende Parameter (somevalue) ist ein int. Sieht mir komisch aus ... –

Antwort

2

Wenn somevalue vom Typ MyEnum, Sie müssen nicht zu einem int gegossen.

public enum Color 
{ 
    Red, 
    Blue, 
    Green 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Color color = Color.Red; 

     switch (color) 
     { 
      case Color.Red: 
       break; 

      case Color.Blue: 
       break; 

      case Color.Green: 
       break; 
     } 
    } 
} 
15

Was ist der Typ von somevalue? Wenn der Typ MyEnum ist, ist Casting nicht notwendig und sollte ohne Fehler funktionieren.

Wenn der Typ int ist, dann müssen Sie zu einem MyEnum wechseln, um richtig zu wechseln. Sie können dies jedoch etwas vereinfachen, indem Sie den Wert anstelle jeder case-Anweisung übergeben. Zum Beispiel

switch((MyEnum)somevalue) { 
    case MyEnum.Value1: ... 
} 
+0

Wirklich -1? Kann ich eine Begründung bekommen? – JaredPar

+1

Ich habe es nicht downvote, aber für mich ist das Problem die Annahme, dass die Besetzung der Enum erfolgreich sein wird. Was ist, wenn der Wert kein gültiger Enum-Wert ist? Siehe meine Antwort später. –

+2

@Walden, es ist irrelevant für die Frage. Die Frage ist "warum wird das nicht kompiliert". Ein Int in ein Enum zu werfen, das von int abgeleitet ist, wird unabhängig vom Wert erfolgreich sein. – JaredPar

4

Offensichtlich Somevalue ist eine ganze Zahl anstatt explizit als Enumeration eingegeben. Sie sollten daran denken, dass die underlying value of an enum is just the "storage type" und ist nicht implizit austauschbar. Sie können jedoch leicht den Cast-Operator verwenden, um Ihren Code einfach und „mehr“ Art sicher zu machen:

private enum MyEnum { Value1, Value2, Value3 } 

switch ((MyEnum)somevalue) 
{ 
    case MyEnum.Value1: 
     someothervar = "ss"; 
     break; 
    case MyEnum.Value2: 
     someothervar = "yy"; 
     break; 
    case MyEnum.Value3: 
     someothervar = "gg"; 
     break; 
    default: 
     throw new NotSupportedException(); 
} 

Schließlich würden Sie eine Design, wo man nicht von einer ganzen Zahl zu einer Enum konvertieren hat, aber oft Beim Lesen von Diskette oder DB ist dies nicht der Fall.

1

Wie andere gesagt haben:

  • Wenn somevalue Typ MyEnum ist, Sie sollte nicht werfen müssen.
  • Wenn Sie aus einer Datenbank oder Textdatei lesen, möchten Sie möglicherweise Enums Parse-Methode verwenden, um einen Enum-Wert aus einer Zeichenfolge zu erhalten.
  • Wenn Sie unbedingt eine Int vergleichen müssen, ist es effizienter, in den Schalter zu MyEnum zu casten, anstatt jeden MyEnum-Wert zu einem int zu werfen.