Яке значення за замовчуванням для змінної enum?


240

Змінна перерахунку, хтось знає, чи завжди вона є дефолтом до першого елемента?


1
Одним із випадків використання випадку, коли бажано перерахування за замовчуванням, є використання змінної змінної. Коли нуль отриманий, він може бути переведений у правильній частині коду до типового, і цей за замовчуванням не повинен бути відомий у решті коду (який просто проходить уздовж нуля).
ЕрікЕ

Відповіді:


381

Це незалежно від того, який член перерахування представляє значення 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).


1
Дякую, а що стосується переліків, визначених char замість int. наприклад, enum Status {Active = 'A', Inactive = 'I'}
Фернандо Торрес

3
@Fernando Torres: Все-таки 0, якщо одному з ваших значень перерахувань не відповідає '\0'або default(char), що малоймовірно, оскільки default(char)це символ NUL, який відповідає char коду 0.
BoltClock

Я (неправильно?) Припускав, що використання DefaultValueатрибута - щось на кшталт - System.ComponentModel.DefaultValue(MyEnum.Blah)могло б змінити поведінку, default(MyEnum)але воно все одно дає 0. Чи немає способу створити абстракцію enumприблизно за замовчуванням?
Крейг Сільвер

2
@Craig Silver: Атрибут DefaultValue застосовується до властивостей - enum є типом і, таким чином, DefaultValue не впливає на тип enum в цілому. Я припускаю, що ви могли б обійти це за допомогою методів розширення, але вам краще просто перевірити 0.
BoltClock

11

Я думаю, що цілком небезпечно покладатися на порядок значень у перерахунку та вважати, що перший завжди є типовим. Це було б хорошою практикою, якщо ви стурбовані захистом значення за замовчуванням.

enum E
{
    Foo = 0, Bar, Baz, Quux
}

В іншому випадку все, що потрібно, - це недбалий рефактор замовлення, і ви отримали зовсім інший дефолт.


3
Вибачте, що ви помиляєтесь Я припустив те саме, але якщо ви поставите Fooпісля Barобох Fooі Barбуде мати значення 0 і E.Foo == E.Barповернетеся true. Це так нерозумно і
контртенітивно,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.