Переменная 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. Это так глупо и нелогично, но это правда :(