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 valueFoo=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).
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.
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 :(
Respostas:
É o membro da enumeração que representa o valor
0
. Especificamente, a partir da documentação :Como exemplo, considere a seguinte enumeração:
Sem substituir os valores padrão, a impressão
default(E)
retorna,Foo
pois é o elemento que ocorre pela primeira vez.No entanto, nem sempre é o caso
0
de um enum é representado pelo primeiro membro. Por exemplo, se você fizer isso:Imprimir
default(F)
lhe daráQuux
, nãoFoo
.Se nenhum dos elementos em uma enumeração
G
corresponder a0
:default(G)
retorna literalmente0
, embora seu tipo permaneça comoG
(conforme citado pelos documentos acima, uma conversão para o tipo de enumeração especificado).fonte
'\0'
oudefault(char)
, o que é altamente improvável, poisdefault(char)
é o personagem NUL que corresponde ao código de caractere 0.DefaultValue
atributo - algo comoSystem.ComponentModel.DefaultValue(MyEnum.Blah)
- modificaria o comportamento de,default(MyEnum)
mas ainda produzirá 0. Não há como criar uma abstração para umenum
valor em torno de seu padrão?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.
Caso contrário, basta um refator descuidado do pedido e você terá um padrão completamente diferente.
fonte
Foo
depois deBar
ambosFoo
eBar
terá o valor 0 eE.Foo == E.Bar
retornarátrue
. É tão estúpido e contra-intuitivo, mas é verdade :(