Jaka jest domyślna wartość zmiennej enum?


240

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


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


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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.