Wenn Sie eine Ausnahmezahl in C# in eine Enum-Ausnahme werfen, wird keine Ausnahme erzeugt

StackOverflow https://stackoverflow.com/questions/618305

  •  03-07-2019
  •  | 
  •  

Frage

Der folgende Code erzeugt keine Ausnahme, übersetzt stattdessen den Wert 4 an TST. Kann jemand den Grund dafür erklären?

 public enum testing
 { 
    a = 1,
    b = 2,
    c = 3
 }

testing tst = (testing)(4);
War es hilfreich?

Lösung

Im Gegensatz zu Java werden Enums in C#nicht überprüft. Sie können einen beliebigen Wert des zugrunde liegenden Typs haben. Aus diesem Grund ist es ziemlich wichtig, Ihre Eingabe zu überprüfen.

if(!Enum.IsDefined(typeof(MyEnum), value))
     throw new ArgumentOutOfRangeException();

Andere Tipps

Da Ihr Enum auf INT basiert, kann er jeden Wert akzeptieren, den INT kann. Und da Sie dem Compiler ausdrücklich (durch Casting) sagen, dass es in Ordnung ist, 4 in Ihren Auflauf zu werfen, ist dies der Fall.

Jeder Enum hat einen zugrunde liegenden numerischen Typ (z. B. int), der zur Darstellung verwendet wird. Auch wenn ein Wert keinen Namen hat, ist er ein möglicher Wert, den die Aufzählung haben kann.

Was andere nicht sagten: Mit Casting sagen Sie dem Compiler, dass Sie wissen, was Sie tun. Wenn Sie es also sagen, behandeln Sie dies als Enum -Wert. Die anderen Poster wiesen darauf hin, warum dies immer noch erlaubt ist, da der C# Compiler nicht viele schlechte Dinge zulässt, auch wenn Sie sagen, dass Sie wissen, was Sie tun.

Es wäre wirklich schlecht, wenn der Wert nicht erlaubt wäre, denn dann konnten Sie keinen Flaggenwert als int speichern. Oder jemand musste prüfen, ob die INT eine der zulässigen Kombinationen ist, die sehr viel sein kann, wenn Sie eine Flag -Aufzählung verwenden (mit Werten, die zusammen oder zusammen sind).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top