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 Eto 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, Fooponieważ jest to element pierwszy.
Jednak nie zawsze jest tak, że 0wyliczenie 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 Quuxnie Foo.
Jeśli żaden z elementów wyliczenia nie Godpowiada 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.
DefaultValueatrybutu - 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 enumjego 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ą.
Foopo Barobu Fooi Barbędzie miało wartość 0 i E.Foo == E.Barwróci true. To takie głupie i sprzeczne z intuicją, ale to prawda :(