Переключатель без значения по умолчанию при работе с перечислениями

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

public enum Decision { Yes, No}

    public class Test
    {
        public string GetDecision(Decision decision)
        {
            switch (decision)
            {
                case Decision.Yes:
                    return "Yes, that's my decision";
                case Decision.No:
                    return "No, that's my decision";

            }
        }
    }

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

Принимая во внимание, что, если компилятор позволил мне использовать мой код выше, он мог бы тогда определить, что у нас есть проблема, поскольку моя инструкция case больше не будет охватывать все значения из моего перечисления. Конечно, звучит намного безопаснее для меня.

Это настолько фундаментально неправильно для меня, что я хочу знать, просто ли это то, чего мне не хватает, или нам просто нужно быть очень осторожным, когда мы используем перечисления в выражениях switch?

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

Что касается enum, который на самом деле просто является int, то это один из грязных маленьких секретов .NET, который довольно смущает. Позвольте мне объявить перечисление с конечным числом возможностей и дать мне компиляцию для:

Decision fred = (Decision)123;

и затем бросить исключение, если кто-то пытается что-то вроде:

int foo = 123;
Decision fred = (Decision)foo;

EDIT 2:

Несколько человек прокомментировали, что происходит, когда enum находится в другой сборке, и как это может привести к проблемам. Я хочу сказать, что такое поведение должно произойти. Если я изменю сигнатуру метода, это приведет к проблемам, моя предпосылка состоит в том, что изменение перечисления должно быть таким же. У меня создается впечатление, что многие люди не думают, что я понимаю о перечислениях в .NET. Я просто думаю, что это неправильное поведение, и я надеялся, что кто-то мог знать о какой-то очень неясной функции, которая изменила бы мое мнение о перечислениях .NET.

Ответы на вопрос(10)

Ваш ответ на вопрос