Подтвердить что ты не робот

В С# задан случай по умолчанию для переключения на перечисление?

Я видел сообщения относящиеся к С++, но я спрашиваю специально для С#.NET(4.0 +).

В следующем примере необходим случай по умолчанию?

public enum MyEnum : int
{
    First,
    Second
}

public class MyClass
{

    public void MyMethod(MyEnum myEnum)
    {
        switch (myEnum)
        {
            case MyEnum.First: /* ... */ break;
            case MyEnum.Second: /* ... */ break;

            default: /* IS THIS NECESSARY??? */ break;
        }
    }
}
4b9b3361

Ответ 1

Это распространенное заблуждение, что значения .Net enum ограничены теми, которые были объявлены в Enum. В действительности, хотя они могут быть любым значением в диапазоне базового типа перечисления (int по умолчанию). Например, совершенно законно

MyMethod((MyEnum)42);

Этот код будет компилироваться без предупреждений и не ударять ни о каких ваших меток case.

Теперь, выбирает ли ваш код обращение с этим типом сценария, является политическим решением. Это не нужно, но я бы наверняка рекомендовал его. Я предпочитаю добавлять default к каждому switch в перечислении, которое я пишу специально для этого сценария со следующим шаблоном

switch (value) { 
  ...
  default: 
    Debug.Fail(String.Format("Illegal enum value {0}", value));
    FailFast();  // Evil value, fail quickly 
}

Ответ 2

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

Я обычно добавляю значение по умолчанию и throw, если указанное значение неожиданно.

Ответ 3

Это не является технически необходимым, а потому, что вы можете легко присвоить значение MyEnum базового типа (обычно int) экземпляру MyEnum. Поэтому хорошей практикой является добавление в нее инструкции по умолчанию с Debug.Assert().

Ответ 4

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

Ответ 5

Нет, случай по умолчанию не требуется.

Ответ 6

С точки зрения чисто кода нет требования иметь случай default. Это исключительно вопрос ваших логических требований.