Una consideración para el caso de uso en el que se desea una enumeración predeterminada es utilizar una variable anulable. Cuando se recibe un valor nulo, se puede traducir en la parte correcta del código al valor predeterminado, y este valor predeterminado no tiene que conocerse en el resto del código (que solo pasa a un valor nulo).
ErikE
Respuestas:
382
Es el miembro de la enumeración que representa el valor 0. Específicamente, de la documentación :
El valor predeterminado de an enum Ees el valor producido por la expresión (E)0.
Como ejemplo, tome la siguiente enumeración:
enum E
{Foo,Bar,Baz,Quux}
Sin anular los valores predeterminados, la impresión default(E)vuelve Fooya que es el primer elemento que ocurre.
Sin embargo, no siempre es el caso 0de una enumeración representada por el primer miembro. Por ejemplo, si haces esto:
enum F
{// Give each element a custom valueFoo=1,Bar=2,Baz=3,Quux=0}
La impresión default(F)te dará Quux, no Foo.
Si ninguno de los elementos en una enumeración Gcorresponde a 0:
enum G
{Foo=1,Bar=2,Baz=3,Quux=4}
default(G)retorna literalmente 0, aunque su tipo permanece como G(como lo citan los documentos anteriores, una conversión al tipo de enumeración dado).
Gracias, y qué hay de las enumeraciones definidas con char en lugar de int. ej. Estado de enumeración {Activo = 'A', Inactivo = 'I'}
Fernando Torres
3
@Fernando Torres: sigue siendo 0, a menos que uno de sus valores de enumeración corresponda a '\0'o default(char), lo cual es altamente improbable ya que default(char)es el carácter NUL que corresponde al código de caracteres 0.
BoltClock
Supuse (¿incorrectamente?) Que usar el DefaultValueatributo, algo así, System.ComponentModel.DefaultValue(MyEnum.Blah)modificaría el comportamiento de default(MyEnum)pero aún produce 0. ¿No hay forma de crear una abstracción para enumalrededor de su valor predeterminado?
Craig Silver
2
@Craig Silver: el atributo DefaultValue se aplica a las propiedades: una enumeración es un tipo y, como tal, DefaultValue no tiene ningún efecto sobre el tipo de enumeración en su conjunto. Supongo que podría
solucionar
11
Creo que es bastante peligroso confiar en el orden de los valores en una enumeración y asumir que el primero es siempre el predeterminado. Esta sería una buena práctica si le preocupa proteger el valor predeterminado.
enum E
{Foo=0,Bar,Baz,Quux}
De lo contrario, todo lo que se necesita es un refactor descuidado del pedido y tiene un valor predeterminado completamente diferente.
Lo siento, te equivocas. Supuse lo mismo, pero si coloca Foodespués de Barambos Fooy Bartendrá un valor de 0 y E.Foo == E.Barvolverá true. Es tan estúpido y contradictorio, pero es cierto :(
Respuestas:
Es el miembro de la enumeración que representa el valor
0
. Específicamente, de la documentación :Como ejemplo, tome la siguiente enumeración:
Sin anular los valores predeterminados, la impresión
default(E)
vuelveFoo
ya que es el primer elemento que ocurre.Sin embargo, no siempre es el caso
0
de una enumeración representada por el primer miembro. Por ejemplo, si haces esto:La impresión
default(F)
te daráQuux
, noFoo
.Si ninguno de los elementos en una enumeración
G
corresponde a0
:default(G)
retorna literalmente0
, aunque su tipo permanece comoG
(como lo citan los documentos anteriores, una conversión al tipo de enumeración dado).fuente
'\0'
odefault(char)
, lo cual es altamente improbable ya quedefault(char)
es el carácter NUL que corresponde al código de caracteres 0.DefaultValue
atributo, algo así,System.ComponentModel.DefaultValue(MyEnum.Blah)
modificaría el comportamiento dedefault(MyEnum)
pero aún produce 0. ¿No hay forma de crear una abstracción paraenum
alrededor de su valor predeterminado?Creo que es bastante peligroso confiar en el orden de los valores en una enumeración y asumir que el primero es siempre el predeterminado. Esta sería una buena práctica si le preocupa proteger el valor predeterminado.
De lo contrario, todo lo que se necesita es un refactor descuidado del pedido y tiene un valor predeterminado completamente diferente.
fuente
Foo
después deBar
ambosFoo
yBar
tendrá un valor de 0 yE.Foo == E.Bar
volverátrue
. Es tan estúpido y contradictorio, pero es cierto :(