Quelle est la valeur par défaut de la variable enum?

241

Une variable enum, quelqu'un sait si elle est toujours par défaut sur le premier élément?

user496949
la source
1
Une considération pour le cas d'utilisation où une énumération par défaut est souhaitée est d'utiliser une variable nullable. Lorsqu'un null est reçu, il peut être traduit dans la partie correcte du code par défaut, et ce défaut n'a pas besoin d'être connu dans le reste du code (qui passe juste le long d'un null).
ErikE

Réponses:

382

C'est tout membre de l'énumération qui représente la valeur 0. Plus précisément, à partir de la documentation :

La valeur par défaut de an enum Eest la valeur produite par l'expression (E)0.

À titre d'exemple, prenez l'énumération suivante:

enum E
{
    Foo, Bar, Baz, Quux
}

Sans remplacer les valeurs par défaut, l'impression default(E)revient Foocar c'est le premier élément apparaissant.

Cependant, il n'est pas toujours vrai que 0l'énumération est représentée par le premier membre. Par exemple, si vous procédez ainsi:

enum F
{
    // Give each element a custom value
    Foo = 1, Bar = 2, Baz = 3, Quux = 0
}

L'impression default(F)vous donnera Quux, non Foo.

Si aucun des éléments d'une énumération ne Gcorrespond à 0:

enum G
{
    Foo = 1, Bar = 2, Baz = 3, Quux = 4
}

default(G)renvoie littéralement 0, bien que son type reste comme G(comme cité par les documents ci-dessus, une conversion vers le type d'énumération donné).

BoltClock
la source
1
Merci, et qu'en est-il des enums définis avec char au lieu de int. par exemple enum Status {Active = 'A', Inactive = 'I'}
Fernando Torres
3
@Fernando Torres: toujours 0, sauf si l'une de vos valeurs d'énumération correspond à '\0'ou default(char), ce qui est hautement improbable car default(char)le caractère NUL correspond au code de caractère 0.
BoltClock
J'ai (incorrectement?) Supposé que l'utilisation de l' DefaultValueattribut - quelque chose comme System.ComponentModel.DefaultValue(MyEnum.Blah)- modifierait le comportement de default(MyEnum)mais il donne toujours 0. N'y a-t-il aucun moyen de créer une abstraction pour un enumautour de sa valeur par défaut?
Craig Silver
2
@Craig Silver: l'attribut DefaultValue s'applique aux propriétés - une énumération est un type et en tant que telle, DefaultValue n'a aucun effet sur le type d'énumération dans son ensemble. Je suppose que vous pouvez contourner cela avec une sorte de méthode d'extension, mais vous feriez mieux de vérifier simplement 0.
BoltClock
11

Je pense qu'il est assez dangereux de se fier à l'ordre des valeurs dans une énumération et de supposer que la première est toujours la valeur par défaut. Ce serait une bonne pratique si vous souhaitez protéger la valeur par défaut.

enum E
{
    Foo = 0, Bar, Baz, Quux
}

Sinon, tout ce qu'il faut, c'est un refactor imprudent de la commande et vous avez un défaut complètement différent.

user3154431
la source
3
Désolé, vous vous trompez. Je l' ai même supposé , mais si vous mettez Fooaprès la Barfois Fooet Baraura une valeur de 0 et E.Foo == E.Barreviendrai true. C'est tellement stupide et contre-intuitif mais c'est vrai :(
Pawcio