Jaka jest domyślna wartość zmiennej enum?

240

Zmienna enum, czy ktoś wie, czy zawsze domyślnie przyjmuje pierwszy element?

użytkownik496949
źródło
1
Jednym z rozważań dotyczących przypadku użycia, w którym pożądane jest domyślne wyliczenie, jest użycie zmiennej dopuszczającej wartości zerowe. Po odebraniu wartości NULL można ją przetłumaczyć w poprawnej części kodu na wartość domyślną, a ta wartość domyślna nie musi być znana w pozostałej części kodu (która po prostu przechodzi przez wartość NULL).
ErikE

Odpowiedzi:

381

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

BoltClock
źródło
1
Dzięki, a co z wyliczeniami zdefiniowanymi za pomocą char zamiast int. np. status enum {Aktywny = „A”, Nieaktywny = „I”}
Fernando Torres
3
@Fernando Torres: Nadal 0, chyba że jedna z twoich wartości wyliczenia odpowiada '\0'lub default(char), co jest bardzo mało prawdopodobne, ponieważ default(char)jest to znak NUL, który odpowiada kodowi znaków 0.
BoltClock
(Niepoprawnie?) Założyłem, że użycie 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?
Craig Silver
2
@Craig Silver: Atrybut DefaultValue ma zastosowanie do właściwości - wyliczenie jest typem i jako takie DefaultValue nie ma wpływu na typ wyliczenia jako całości. Podejrzewam, że możesz obejść ten problem za pomocą metody rozszerzenia, ale lepiej sprawdzić po prostu 0.
BoltClock
11

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ą.

użytkownik3154431
źródło
3
Przepraszam, że się mylisz. Założyłem to samo, ale jeśli wstawisz 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 :(
Pawcio,