¿Cuál es el valor predeterminado para la variable enum?

241

Una variable de enumeración, ¿alguien sabe si siempre está predeterminado al primer elemento?

user496949
fuente
1
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 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).

BoltClock
fuente
1
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.

usuario3154431
fuente
3
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 :(
Pawcio