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

240

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

user496949
quelle
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).

BoltClock
quelle
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.

user3154431
quelle
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