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 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 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 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).
'\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.
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?
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.
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 :(