2016-06-10 12 views
-1

Warum muss ich zu Uint umwandeln, wenn die enum im folgenden Beispiel bereits eine Uint ist? Ändert auch : uint überhaupt etwas? Wenn ich es entferne, bekomme ich die gleichen Fehler. args.Progress ist ein Uint.Konvertieren von enum in uint

switch (args.Progress) 
{ 
    case (uint) Values.value1: // works 
     break; 
    case Values.value2: // error 
     break; 
} 

public enum Values : uint 
{ 
    value1, 
    value2 
}; 
+0

args.Progress ist ein Uint vermutlich? –

+1

Nun, Sie könnten auch args.Progress zu einem 'Values';)' Schalter ((Werte) args.Progress) ' –

+0

@BenJackson ja, ich habe die Info – Nfear

Antwort

5

Die Spezifikation : uint ist es nicht ein uint machen. Es definiert nur den Typ jedes Mitglieds, aber ein enum ist immer noch ein enum.

Aus Enumerationsdefinition wie:

public enum Foo : uint 
{ 
    MemberA, 
    MemberB 
} 

Compiler (mehr oder weniger) erstellt eine Klasse mit Konstanten

public class Foo 
{ 
    public const uint MemberA = 0; 

    public const uint MemberB = 1; 
} 

Der Grund : long oder etwas zu geben ist Ihre Werte passen, um sicherzustellen, darin und dass es korrekt auf alle Variablen abgebildet ist, auf die Sie es anwenden wollen. Es ist auch wichtig, wenn Sie mit DllImport von C-Code arbeiten, wo es auf konstante Werte aus den Header-Dateien abgebildet wird.

2

tl; dr:Values und uint sind nicht gleich, aber es ist ausdrücklich umwandelbar.

switch müssen beide Werte (der Wert, der umgeschaltet wird und die Werte, mit denen er verglichen wird) vom selben Typ sein (oder zumindest implizit konvertierbar sein). Sie können einen Enum-Wert nicht implizit in den jeweiligen Integraltyp konvertieren (oder umgekehrt). Aus dem gleichen Grund können Sie nicht einen ganzzahligen Wert zu einem Enum-Typ Variablen zuweisen:

enum Foo { Spam = 1, Egg = 2, Bar = 4 } 

Foo test = 1; 

Dies führt zu einem Compiler-Ausnahme:

Fehler CS0266: Kann nicht implizit Typ ‚int‘ konvertieren "Foo". Eine explizite Konvertierung existiert (fehlt eine Besetzung?

)

Was Sie können Sie entweder Wert auf die andere Art gegossen wird:

Foo test = (Foo)1; 
int test2 = (int)Foo.Egg; 

Das gleiche gilt für den Vergleich:

if(test == 1) { Console.WriteLine("It's 1!"); } 

Fehler CS0019: Operator ‚= = 'kann nicht auf Operanden vom Typ' Foo 'und' int 'angewendet werden

if(test2 == Foo.Egg) { Console.WriteLine("It's an egg!"); } 

Fehler CS0019: Operator ‚==‘ auf Operanden vom Typ werden kann nicht ‚int‘ angelegt und ‚Foo‘

jedoch warf einer der Werte auf den Typ des anderen, und es wirkt wie ein Zauber:

if((int)test == 1) { Console.WriteLine("It's 1!"); } 
if(test == (Foo)1) { Console.WriteLine("It's 1!"); } 
if((Foo)test2 == Foo.Egg) { Console.WriteLine("It's an egg!"); } 
if(test2 == (int)Foo.Egg) { Console.WriteLine("It's an egg!"); } 

es ist 1!

Es ist 1!

Es ist ein Ei!

Es ist ein Ei!