Laden...

Warum kann ich Enum kein Int zuweisen?

Erstellt von getit vor 2 Jahren Letzter Beitrag vor 2 Jahren 371 Views
G
getit Themenstarter:in
3 Beiträge seit 2021
vor 2 Jahren
Warum kann ich Enum kein Int zuweisen?

using System;
 
class Test {
 
  enum Weekday {
    Sonntag,
    Montag,
    Dienstag
  }
 
  static void Main(string[] args) {
    Weekday myDay0 = 0; //1
    Weekday myDay1 = 1; //2
  }
}

Warum funktioniert der Code (welcher mit 1 markiert ist) und der Code welcher mit 2 markiert ist nicht?

Nachdem der Code (Makierung 2) hinzugefügt wurde, lässt sich der Code nicht mehr kompilieren. Fehlermeldung:
test.cs(11,22): error CS0266: Der Typ 'int' kann nicht implizit in 'Test.Weekday' konvertiert werden. Es ist bereits
eine Implizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)

C
2.121 Beiträge seit 2010
vor 2 Jahren

Da du die Variablen nicht als Zahl deklariert hast sondern als Weekday, will der Compiler dafür auch ein Element der Aufzählung haben.
Du könntest das casten als (Weekday)1, dann geht das. Aber dann nimmst du dir den Vorteil, sofort sehen zu können welches Aufzählungselement das ist.
Soweit dazu warum die 1 nicht ohne ausdrücklichen Cast akzeptiert wird.

Warum die 0 dann doch funktioniert, könnte daran liegen dass eine solche Variable mit einer 0 vorbelegt wird wenn du nichts anderes angibst. Daher könnte es sein dass der Compiler erkennt, da passiert ja nichts was ohne diese Zeile nicht auch passieren würde, und er deswegen die Zuweisung hinnimmt.

G
getit Themenstarter:in
3 Beiträge seit 2021
vor 2 Jahren

Danke für die Erklärung.

J
61 Beiträge seit 2020
vor 2 Jahren

Das Verhalten im obigen Code ist ein Bug, eigentlich sollte auch die Zuweisung von „0“ nicht funktionieren.

Siehe why-can-i-assign-0-0-to-enumeration-values-but-not-1-0

G
getit Themenstarter:in
3 Beiträge seit 2021
vor 2 Jahren

Danke, dass du nachgeforscht hast.

D
261 Beiträge seit 2015
vor 2 Jahren

Das Verhalten im obigen Code ist ein Bug, eigentlich sollte auch die Zuweisung von „0“ nicht funktionieren.

Siehe
>

Wenn man den Beitrag auf Stackoverflow richtig liest, dann steht dort, dass die Zuweisung von 0 zu einem Enum laut C# Spezifikation erlaubt ist. Nur die Zuweisung von 0.0 (0.0m und 0.0f) ist ein Bug und sollte nicht erlaubt sein. Der von getit gepostete Code enthält also keinen Bug, sondern die C# Spezfikation schreibt es so vor.

16.827 Beiträge seit 2008
vor 2 Jahren

dass die Zuweisung von 0 zu einem Enum laut C# Spezifikation erlaubt ist.

Absolut korrekt.
Besonderes Augenmerkt sollte man hier auf den Beitrag von Eric Lippert (damals beim Lagnuage Design von C# bei Microsoft gewesen, heute bei Facebook), in dem er beschreibt, wieso das so ist - und dass er dafür verantwortlich war/ist.
Der historische Grund, wieso man 0 erlaubt hatte, war meines Wissens die damalige Grundbasis von C.