Змінна перерахунку, хтось знає, чи завжди вона є дефолтом до першого елемента?
Змінна перерахунку, хтось знає, чи завжди вона є дефолтом до першого елемента?
Відповіді:
Це незалежно від того, який член перерахування представляє значення 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.
Якщо жоден з елементів у enum не Gвідповідає 0:
enum G
{
Foo = 1, Bar = 2, Baz = 3, Quux = 4
}
default(G)повертається буквально 0, хоча його тип залишається таким, як G(як це цитується в документах вище, відступ для даного типу enum).
'\0'або default(char), що малоймовірно, оскільки default(char)це символ NUL, який відповідає char коду 0.
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. Це так нерозумно і