Qual è il valore predefinito per la variabile enum?


241

Una variabile enum, qualcuno sa se è sempre predefinito al primo elemento?


1
Una considerazione per il caso d'uso in cui si desidera un enum predefinito è l'uso di una variabile nullable. Quando viene ricevuto un valore null, può essere tradotto nella parte corretta del codice nel valore predefinito e questo valore predefinito non deve essere noto nel resto del codice (che passa semplicemente lungo un valore null).
ErikE

Risposte:


382

Indipendentemente dal membro dell'enumerazione, rappresenta il valore 0. In particolare, dalla documentazione :

Il valore predefinito di an enum Eè il valore prodotto dall'espressione (E)0.

Ad esempio, prendi il seguente enum:

enum E
{
    Foo, Bar, Baz, Quux
}

Senza sovrascrivere i valori predefiniti, la stampa default(E)ritorna Foopoiché è il primo elemento ricorrente.

Tuttavia, non è sempre il caso che 0un enum sia rappresentato dal primo membro. Ad esempio, se lo fai:

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

La stampa default(F)ti darà Quux, non è Foo.

Se nessuno degli elementi in un enum Gcorrisponde a 0:

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

default(G)ritorna letteralmente 0, sebbene il suo tipo rimanga come G(come citato dai documenti sopra, un cast per il tipo enum dato).


1
Grazie e che dire degli enum definiti con char anziché con int. es. enum Status {Active = 'A', Inactive = 'I'}
Fernando Torres

3
@Fernando Torres: Ancora 0, a meno che uno dei tuoi valori enum corrisponda a '\0'o default(char), il che è altamente improbabile poiché default(char)è il carattere NUL che corrisponde al codice char 0.
BoltClock

Ho (erroneamente?) Ipotizzato che l'uso DefaultValuedell'attributo - qualcosa di simile - System.ComponentModel.DefaultValue(MyEnum.Blah)avrebbe modificato il comportamento di default(MyEnum)ma produce ancora 0. Non c'è modo di creare un'astrazione per un enumvalore intorno al suo valore predefinito?
Craig Silver,

2
@Craig Silver: l'attributo DefaultValue si applica alle proprietà: un enum è un tipo e come tale DefaultValue non ha alcun effetto sul tipo di enum nel suo insieme. Suppongo che potresti aggirare questo problema con una sorta di metodo di estensione, ma stai meglio controllando solo 0.
BoltClock

11

Penso che sia abbastanza pericoloso fare affidamento sull'ordine dei valori in un enum e supporre che il primo sia sempre il valore predefinito. Questa sarebbe una buona pratica se sei preoccupato di proteggere il valore predefinito.

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

Altrimenti, tutto ciò che serve è un rifattore incurante dell'ordine e hai un valore di default completamente diverso.


3
Scusa, ti sbagli. Ho assunto lo stesso, ma se lo metti Foodopo Barentrambi Fooe Baravrai un valore di 0 e E.Foo == E.Bartornerà true. È così stupido e controintuitivo ma è vero :(
Pawcio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.