Одним из соображений для случая использования, когда требуется перечисление по умолчанию, является использование переменной, допускающей значение 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 valueFoo=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(как указано в документации выше, приведение к данному типу перечисления).
Спасибо, а как насчет перечислений, определенных с помощью 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}
В противном случае все, что нужно, - это неосторожный рефакторинг ордера, и вы получите совершенно другой дефолт.
Извините, что вы не правы. Я предположил то же самое, но если вы поставите Fooпосле Barобоих Fooи Barбудет иметь значение 0 и E.Foo == E.Barвернется true. Это так глупо и нелогично, но это правда :(
Ответы:
Это какой-либо член перечисления представляет значение
0
. Конкретно из документации :В качестве примера возьмем следующее перечисление:
Без переопределения значений по умолчанию печать
default(E)
возвращается,Foo
поскольку это первый встречающийся элемент.Однако, это не всегда тот случай,
0
когда перечисление представлено первым членом. Например, если вы делаете это:Печать
default(F)
даст вамQuux
, а неFoo
.Если ни один из элементов в перечислении не
G
соответствует0
:default(G)
возвращает буквально0
, хотя его тип остается какG
(как указано в документации выше, приведение к данному типу перечисления).источник
'\0'
илиdefault(char)
, что весьма маловероятно, посколькуdefault(char)
это символ NUL, соответствующий кодовомуDefaultValue
атрибута - что-то вродеSystem.ComponentModel.DefaultValue(MyEnum.Blah)
- изменило бы поведение,default(MyEnum)
но оно все равно дает 0. Нет ли способа создать абстракцию для значенияenum
по умолчанию?Я думаю, что довольно опасно полагаться на порядок значений в перечислении и предполагать, что первое всегда является значением по умолчанию. Это будет хорошей практикой, если вы заинтересованы в защите значения по умолчанию.
В противном случае все, что нужно, - это неосторожный рефакторинг ордера, и вы получите совершенно другой дефолт.
источник
Foo
послеBar
обоихFoo
иBar
будет иметь значение 0 иE.Foo == E.Bar
вернетсяtrue
. Это так глупо и нелогично, но это правда :(