Змінна перерахунку, хтось знає, чи завжди вона є дефолтом до першого елемента?
Змінна перерахунку, хтось знає, чи завжди вона є дефолтом до першого елемента?
Відповіді:
Це незалежно від того, який член перерахування представляє значення 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
. Це так нерозумно і