Was ist der Standardwert für die Enum-Variable?


240

Eine Aufzählungsvariable, weiß jemand, ob immer das erste Element standardmäßig verwendet wird?


1
Eine Überlegung für den Anwendungsfall, in dem eine Standardaufzählung gewünscht wird, ist die Verwendung einer nullbaren Variablen. Wenn eine Null empfangen wird, kann sie im richtigen Teil des Codes in die Standardeinstellung übersetzt werden, und diese Standardeinstellung muss im Rest des Codes nicht bekannt sein (der nur eine Null weitergibt).
ErikE

Antworten:


381

Es ist das Mitglied der Aufzählung, das den Wert darstellt 0. Insbesondere aus der Dokumentation :

Der Standardwert von a enum Eist der vom Ausdruck erzeugte Wert (E)0.

Nehmen Sie als Beispiel die folgende Aufzählung:

enum E
{
    Foo, Bar, Baz, Quux
}

Ohne die Standardwerte zu überschreiben, wird beim Drucken default(E)zurückgegeben, Fooda es sich um das erste Element handelt.

Es ist jedoch nicht immer der Fall, dass 0eine Aufzählung vom ersten Mitglied vertreten wird. Wenn Sie dies beispielsweise tun:

enum F
{
    // Give each element a custom value
    Foo = 1, Bar = 2, Baz = 3, Quux = 0
}

Drucken default(F)gibt Ihnen Quuxnicht Foo.

Wenn keines der Elemente in einer Aufzählung Gentspricht 0:

enum G
{
    Foo = 1, Bar = 2, Baz = 3, Quux = 4
}

default(G)Gibt buchstäblich zurück 0, obwohl sein Typ unverändert bleibt G(wie in den obigen Dokumenten angegeben, eine Umwandlung in den angegebenen Aufzählungstyp).


1
Danke, und was ist mit Aufzählungen, die mit char anstelle von int definiert wurden? zB Aufzählungsstatus {Aktiv = 'A', Inaktiv = 'I'}
Fernando Torres

3
@ Fernando Torres: Immer noch 0, es sei denn, einer Ihrer Aufzählungswerte entspricht '\0'oder default(char), was höchst unwahrscheinlich ist, da default(char)das NUL-Zeichen dem Zeichencode 0 entspricht.
BoltClock

Ich habe (fälschlicherweise?) Angenommen , dass die Verwendung des DefaultValueAttributs - so etwas wie System.ComponentModel.DefaultValue(MyEnum.Blah)- das Verhalten von ändern würde, default(MyEnum)aber dennoch 0 ergibt. Gibt es keine Möglichkeit, eine Abstraktion für einen enumWert um den Standardwert herum zu erstellen ?
Craig Silver

2
@Craig Silver: Das DefaultValue-Attribut gilt für Eigenschaften. Eine Aufzählung ist ein Typ. Daher hat DefaultValue keine Auswirkung auf den Aufzählungstyp insgesamt. Ich nehme an, Sie könnten dies mit einer Art Erweiterungsmethode
umgehen

11

Ich denke, es ist ziemlich gefährlich, sich auf die Reihenfolge der Werte in einer Aufzählung zu verlassen und anzunehmen, dass die erste immer die Standardeinstellung ist. Dies ist eine gute Vorgehensweise, wenn Sie den Standardwert schützen möchten.

enum E
{
    Foo = 0, Bar, Baz, Quux
}

Andernfalls ist nur ein nachlässiger Refactor der Bestellung erforderlich, und Sie haben eine völlig andere Standardeinstellung.


3
Entschuldigung, du liegst falsch. Ich habe das gleiche angenommen, aber wenn Sie Foonach Barbeiden setzen Foound Barden Wert 0 haben und E.Foo == E.Barzurückkehren true. Es ist so dumm und nicht
intuitiv
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.