Una variabile enum, qualcuno sa se è sempre predefinito al primo elemento?
Una variabile enum, qualcuno sa se è sempre predefinito al primo elemento?
Risposte:
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 Foo
poiché è il primo elemento ricorrente.
Tuttavia, non è sempre il caso che 0
un 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 G
corrisponde 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).
'\0'
o default(char)
, il che è altamente improbabile poiché default(char)
è il carattere NUL che corrisponde al codice char 0.
DefaultValue
dell'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 enum
valore intorno al suo valore predefinito?
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.
Foo
dopo Bar
entrambi Foo
e Bar
avrai un valore di 0 e E.Foo == E.Bar
tornerà true
. È così stupido e controintuitivo ma è vero :(