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