Zmienna enum, czy ktoś wie, czy zawsze domyślnie przyjmuje pierwszy element?
Zmienna enum, czy ktoś wie, czy zawsze domyślnie przyjmuje pierwszy element?
Odpowiedzi:
Jest to dowolny element wyliczenia reprezentujący wartość 0
. W szczególności z dokumentacji :
Wartość domyślna
enum E
to wartość wygenerowana przez wyrażenie(E)0
.
Jako przykład weźmy następujące wyliczenie:
enum E
{
Foo, Bar, Baz, Quux
}
Bez przesłonięcia wartości domyślnych drukowanie default(E)
powraca, Foo
ponieważ jest to element pierwszy.
Jednak nie zawsze jest tak, że 0
wyliczenie jest reprezentowane przez pierwszego członka. Na przykład, jeśli to zrobisz:
enum F
{
// Give each element a custom value
Foo = 1, Bar = 2, Baz = 3, Quux = 0
}
Drukowanie default(F)
da ci Quux
nie Foo
.
Jeśli żaden z elementów wyliczenia nie G
odpowiada 0
:
enum G
{
Foo = 1, Bar = 2, Baz = 3, Quux = 4
}
default(G)
zwraca dosłownie 0
, chociaż jego typ pozostaje jako G
(jak zacytowano w powyższych dokumentach, rzut na dany typ wyliczenia).
'\0'
lub default(char)
, co jest bardzo mało prawdopodobne, ponieważ default(char)
jest to znak NUL, który odpowiada kodowi znaków 0.
DefaultValue
atrybutu - coś w rodzaju - System.ComponentModel.DefaultValue(MyEnum.Blah)
zmodyfikowałoby zachowanie, default(MyEnum)
ale nadal daje 0. Czy nie ma sposobu, aby stworzyć abstrakcję dla enum
jego wartości domyślnej?
Myślę, że dość niebezpieczne jest poleganie na kolejności wartości w wyliczeniu i założenie, że pierwszy jest zawsze domyślny. Byłaby to dobra praktyka, jeśli obawiasz się ochrony wartości domyślnej.
enum E
{
Foo = 0, Bar, Baz, Quux
}
W przeciwnym razie wystarczy nieostrożny refaktor zamówienia i masz zupełnie inną wartość domyślną.
Foo
po Bar
obu Foo
i Bar
będzie miało wartość 0 i E.Foo == E.Bar
wróci true
. To takie głupie i sprzeczne z intuicją, ale to prawda :(