Math mit Enums (z. B. DayOfWeek) in C #

7

Warum funktioniert der folgende Code nicht?

%Vor%

Während dies:

%Vor%

?

(Mit "wird nicht funktionieren" meine ich die Ergebnisse im folgenden Kompilierungsfehler: "kann nicht von 'System.DayOfWeek' in 'double' konvertieren")

    
nicolaskruchten 04.06.2009, 17:19
quelle

3 Antworten

12

Um zu erweitern, was Lasse gesagt hat (oder besser gesagt, etwas expliziter machen).

Weil 0 in einen Enum-Typ konvertierbar ist,

%Vor%

Und da Sie ein Enum von einem anderen subtrahieren können und einen ganzzahligen Unterschied erhalten:

%Vor%

Da das Ergebnis der Subtraktion ein int ist, können Sie ihm 7 hinzufügen.

%Vor%

Also, wenn Montags Enum-Wert 1 ist

%Vor%

Sie können jedoch nicht das Gegenteil tun.

%Vor%

, weil der Ergebnistyp der Berechnung von der ganz linken Seite abhängt. Während also 0 - endDate.DayOfWeek eine Ganzzahl ergibt, ergibt endDate.DayOfWeek - 0 eine enum DayOfWeek.

Interessanterweise könntest du diesen Nebeneffekt verwenden, um den Wert eines Enums ohne Casting zu erhalten, obwohl ich dieses hackische und verwirrende ... also als vermieden ansehe.

%Vor%     
Erik Funkenbusch 04.06.2009, 17:50
quelle
4

Das ist sehr interessant. Der richtige Weg dazu ist:

%Vor%

Aber Ihre Frage ist nicht eine Lösung, sondern ein Grund für das Verhalten. Es hat etwas damit zu tun, wie der Compiler eine Null behandelt. Jede Zeile schlägt fehl, wenn keine Null vorhanden ist, während beide Zeilen funktionieren, wenn eine Null vorhanden ist.

    
John Fisher 04.06.2009 17:28
quelle
4

Sie können zwei Aufzählungswerte subtrahieren, um deren ganzzahligen Wertunterschied zu erhalten:

%Vor%

Druckt 3 aus.

Aber Sie können nicht hinzufügen, macht wahrscheinlich keinen Sinn.

Im Fall von "0" ist 0 für alle Aufzählungstypen automatisch konvertierbar, also bedeutet "0 - enumvalue" dasselbe wie "(enumtype) 0 - enumvalue", was wiederum funktioniert.

    
quelle

Tags und Links