Umwandlung von int in enum in C#: 5 fatale Fehler und wie man sie vermeidet

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Umwandlung von int in enum in C#: Warum das den Code zerstört und wie man es richtig repariert

\n\n

Jeder C#-Entwickler, selbst mit nur wenigen Monaten Erfahrung, stößt früher oder später auf die Frage: „How do I cast int to enum in C#?“. Diese Anfrage auf Stack Overflow hat Hunderttausende von Aufrufen – und das zu Recht. Es scheint einfach: Schreiben Sie (MyEnum)myInt – und fertig. Aber der Teufel steckt, wie immer, im Detail. Eine falsche Umwandlung von int in enum kann zu Ausnahmen, schwer auffindbaren Bugs und sogar zum Absturz eines Produktionsservers führen.

\n\n

In diesem Artikel analysieren wir die Top-5 Fehler bei der Umwandlung von int in enum, zeigen funktionierende Beispiele in C# und geben einen klaren Algorithmus für eine sichere Konvertierung. Wenn Sie in C# programmieren und Aufzählungen verwenden, spart Ihnen diese Information Stunden des Debuggens.

\n\n

Fehler Nr. 1: Naive Umwandlung ohne Prüfung – „Was ist, wenn die Zahl ungültig ist?“

\n\n

Die häufigste Methode, die Anfänger im Internet finden, ist die direkte Umwandlung:

\n\n
enum Status\n{\n    Active = 1,\n    Inactive = 2,\n    Pending = 3\n}\n\nint input = 5; // Der Benutzer hat etwas Falsches gesendet\nStatus status = (Status)input; // Kein Fehler, aber status == (Status)5\nConsole.WriteLine(status); // Ausgabe: 5 – ein Müllwert!\n
\n\n

Der Code wird kompiliert und ohne Ausnahme ausgeführt. Aber die Variable status enthält jetzt den Wert 5, der im enum Status nicht existiert. In C# sind Aufzählungen im Grunde genommen ganze Zahlen mit Namen. Der Compiler prüft nicht, ob der Wert zur Menge der Konstanten gehört. Dies ist eine klassische Falle: Die Umwandlung von int in enum funktioniert technisch, ist aber logisch gesehen ein Bug.

\n\n

Wie man es vermeidet: Verwenden Sie vor der Umwandlung immer die Methode Enum.IsDefined().

\n\n
if (Enum.IsDefined(typeof(Status), input))\n{\n    Status status = (Status)input;\n}\nelse\n{\n    // Fehlerbehandlung: Protokollierung, Standardwert oder Ausnahme\n    Console.WriteLine($"Ungültiger Wert {input} für Status");\n}\n
\n\n

Denken Sie daran: Enum.IsDefined() ist bei häufigen Aufrufen langsam, aber für einmalige Operationen ist es ein idealer Wächter.

\n\n

Fehler Nr. 2: Ignorieren von Flag-Aufzählungen ([Flags])

\n\n

Wenn Sie mit Aufzählungen arbeiten, die mit dem Attribut [Flags] gekennzeichnet sind, ändert sich die Prüflogik. Enum.IsDefined() gibt false für Kombinationen von Flags zurück, selbst wenn diese korrekt sind.

\n\n
[Flags]\nenum Permissions\n{\n    None = 0,\n    Read = 1,\n    Write = 2,\n    Execute = 4\n}\n\nint input = 3; // Read + Write\nif (Enum.IsDefined(typeof(Permissions), input))\n{\n    // Dies wird nicht ausgeführt! 3 ist keine einzelne Konstante\n}\n
\n\n

Für Flags müssen Sie eine andere Prüfung verwenden: Ob alle Bits in der Zahl bestimmten Werten entsprechen.

\n\n
bool IsValidFlags<T>(int value) where T : Enum\n{\n    int allValues = 0;\n    foreach (var v in Enum.GetValues<T>())\n    {\n        allValues |= Convert.ToInt32(v);\n    }\n    return (value & ~allValues) == 0;\n}\n\nif (IsValidFlags<Permissions>(input))\n{\n    Permissions perms = (Permissions)input; // Sicher\n}\n
\n\n

Oder einfacher: Verwenden Sie die integrierte Prüfung Enum.IsDefined() für jedes einzelne Flag, wenn es nicht viele sind.

\n\n

Fehler Nr. 3: Vergessene Behandlung von negativen Zahlen und Überläufen

\n\n

Enum in C# basiert standardmäßig auf int, kann aber auch byte, short, long usw. sein. Wenn Sie int in ein enum umwandeln, dessen Basistyp byte ist, riskieren Sie eine Ausnahme bei Überlauf oder, schlimmer noch, eine stille Verfälschung des Werts.

\n\n
enum SmallEnum : byte\n{\n    A = 0,\n    B = 255\n}\n\nint bigValue = 300;\nSmallEnum se = (SmallEnum)bigValue; // Kompilierungsfehler? Nein!\n// Aber der Wert wird abgeschnitten: se == (SmallEnum)44 (300 % 256)\n

Blogs

Buchempfehlungen