Что является значением по умолчанию для переменной перечисления

Перечислимая переменная, кто-нибудь знает, всегда ли она по умолчанию не соответствует первому элементу?

Ответ 1

Это то, что член перечисления представляет значение 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 (как указано в документах выше, приведение к указанному типу перечисления).

Ответ 2

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

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

В противном случае все, что требуется, это неосторожный рефакторинг заказа, и у вас есть совершенно другой по умолчанию.