Qual é o valor padrão para a variável enum?

240

Uma variável enum, alguém sabe se é sempre o padrão para o primeiro elemento?

user496949
fonte
1
Uma consideração para o caso de uso em que uma enum padrão é desejada é usar uma variável anulável. Quando um nulo é recebido, ele pode ser convertido na parte correta do código no padrão, e esse padrão não precisa ser conhecido no restante do código (que passa apenas um nulo).
ErikE

Respostas:

381

É o membro da enumeração que representa o valor 0. Especificamente, a partir da documentação :

O valor padrão de um enum Eé o valor produzido pela expressão (E)0.

Como exemplo, considere a seguinte enumeração:

enum E
{
    Foo, Bar, Baz, Quux
}

Sem substituir os valores padrão, a impressão default(E)retorna, Foopois é o elemento que ocorre pela primeira vez.

No entanto, nem sempre é o caso 0de um enum é representado pelo primeiro membro. Por exemplo, se você fizer isso:

enum F
{
    // Give each element a custom value
    Foo = 1, Bar = 2, Baz = 3, Quux = 0
}

Imprimir default(F)lhe dará Quux, não Foo.

Se nenhum dos elementos em uma enumeração Gcorresponder a 0:

enum G
{
    Foo = 1, Bar = 2, Baz = 3, Quux = 4
}

default(G)retorna literalmente 0, embora seu tipo permaneça como G(conforme citado pelos documentos acima, uma conversão para o tipo de enumeração especificado).

BoltClock
fonte
1
Obrigado, e quanto às enumerações definidas com char em vez de int. por exemplo, enum Status {Ativo = 'A', Inativo = 'I'}
Fernando Torres
3
@Fernando Torres: Still 0, a menos que um de seus valores ENUM corresponde a '\0'ou default(char), o que é altamente improvável, pois default(char)é o personagem NUL que corresponde ao código de caractere 0.
BoltClock
Eu (incorretamente?) Assumi que o uso do DefaultValueatributo - algo como System.ComponentModel.DefaultValue(MyEnum.Blah)- modificaria o comportamento de, default(MyEnum)mas ainda produzirá 0. Não há como criar uma abstração para um enumvalor em torno de seu padrão?
Craig Silver
2
@ Craig Silver: O atributo DefaultValue se aplica a propriedades - uma enum é um tipo e, como tal, DefaultValue não tem efeito no tipo de enum como um todo. Suponho que você possa contornar isso com um tipo de método de extensão, mas é melhor verificar apenas 0.
BoltClock
11

Eu acho que é muito perigoso confiar na ordem dos valores em uma enumeração e assumir que o primeiro é sempre o padrão. Isso seria uma boa prática se você estiver preocupado em proteger o valor padrão.

enum E
{
    Foo = 0, Bar, Baz, Quux
}

Caso contrário, basta um refator descuidado do pedido e você terá um padrão completamente diferente.

user3154431
fonte
3
Desculpe, você está errado. Eu assumi o mesmo, mas se você colocar Foodepois de Barambos Fooe Barterá o valor 0 e E.Foo == E.Barretornará true. É tão estúpido e contra-intuitivo, mas é verdade :(
Pawcio 10/07/19