Какое значение по умолчанию для переменной enum?

241

Переменная enum, кто-нибудь знает, всегда ли это значение по умолчанию для первого элемента?

user496949
источник
1
Одним из соображений для случая использования, когда требуется перечисление по умолчанию, является использование переменной, допускающей значение NULL. Когда получено значение NULL, оно может быть преобразовано в правильной части кода в значение по умолчанию, и это значение по умолчанию не должно быть известно в остальной части кода (который просто передает значение NULL).
ErikE

Ответы:

382

Это какой-либо член перечисления представляет значение 0. Конкретно из документации :

Значением по умолчанию enum Eявляется значение, созданное выражением (E)0.

В качестве примера возьмем следующее перечисление:

enum E
{
    Foo, Bar, Baz, Quux
}

Без переопределения значений по умолчанию печать default(E)возвращается, Fooпоскольку это первый встречающийся элемент.

Однако, это не всегда тот случай, 0когда перечисление представлено первым членом. Например, если вы делаете это:

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

Печать default(F)даст вам Quux, а не Foo.

Если ни один из элементов в перечислении не Gсоответствует 0:

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

default(G)возвращает буквально 0, хотя его тип остается как G(как указано в документации выше, приведение к данному типу перечисления).

BoltClock
источник
1
Спасибо, а как насчет перечислений, определенных с помощью char вместо int. например, enum Status {Active = 'A', Inactive = 'I'}
Фернандо Торрес
3
@Fernando Torres: по-прежнему 0, если только одно из ваших значений перечисления не соответствует '\0'или default(char), что весьма маловероятно, поскольку default(char)это символ NUL, соответствующий кодовому
символу
Я (неправильно?) Предположил, что использование DefaultValueатрибута - что-то вроде System.ComponentModel.DefaultValue(MyEnum.Blah)- изменило бы поведение, default(MyEnum)но оно все равно дает 0. Нет ли способа создать абстракцию для значения enumпо умолчанию?
Крейг Сильвер
2
@Craig Silver: атрибут DefaultValue применяется к свойствам - перечисление является типом, и поэтому DefaultValue не влияет на тип перечисления в целом. Я полагаю, вы могли бы обойти это с помощью метода расширений, но вам лучше просто проверить на 0.
BoltClock
11

Я думаю, что довольно опасно полагаться на порядок значений в перечислении и предполагать, что первое всегда является значением по умолчанию. Это будет хорошей практикой, если вы заинтересованы в защите значения по умолчанию.

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

В противном случае все, что нужно, - это неосторожный рефакторинг ордера, и вы получите совершенно другой дефолт.

user3154431
источник
3
Извините, что вы не правы. Я предположил то же самое, но если вы поставите Fooпосле Barобоих Fooи Barбудет иметь значение 0 и E.Foo == E.Barвернется true. Это так глупо и нелогично, но это правда :(
Pawcio