Una variable de enumeración, ¿alguien sabe si siempre está predeterminado al primer elemento?
Una variable de enumeración, ¿alguien sabe si siempre está predeterminado al primer elemento?
Respuestas:
Es el miembro de la enumeración que representa el valor 0
. Específicamente, de la documentación :
El valor predeterminado de an
enum E
es 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 Foo
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:
enum F
{
// Give each element a custom value
Foo = 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 G
corresponde 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).
'\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.
DefaultValue
atributo, 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 enum
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.
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.
Foo
después de Bar
ambos Foo
y Bar
tendrá un valor de 0 y E.Foo == E.Bar
volverá true
. Es tan estúpido y contradictorio, pero es cierto :(