Это было мое домашнее животное, так как я начал использовать .NET, но мне было любопытно, если я что-то упустил. Мой фрагмент кода не будет компилироваться (пожалуйста, простите принудительный характер образца), потому что (согласно компилятору) отсутствует оператор return:
public enum Decision { Yes, No}
public class Test
{
public string GetDecision(Decision decision)
{
switch (decision)
{
case Decision.Yes:
return "Yes, that my decision";
case Decision.No:
return "No, that my decision";
}
}
}
Теперь я знаю, что могу просто поместить инструкцию по умолчанию, чтобы избавиться от предупреждения о совместимости, но, на мой взгляд, это не избыточный код, его опасный код. Если перечисление было в другом файле, и появился другой разработчик, и добавляет Может быть, к моему перечислению это будет обрабатываться по умолчанию, которое ничего не знает о Maybes, и есть действительно хороший шанс, что мы вводим логическую ошибку.
В то время как если компилятор разрешил мне использовать мой код выше, он мог бы определить, что у нас есть проблема, так как мой оператор case больше не будет покрывать все значения из моего перечисления. Конечно, звуки намного безопаснее для меня.
Это настолько принципиально неправильно для меня, что я хочу знать, если его просто что-то мне не хватает, или нам просто нужно быть очень осторожным, когда мы используем перечисления в операторах switch?
EDIT: Я знаю, что могу поменять исключения по умолчанию или добавить возврат за пределы коммутатора, но это по-прежнему фундаментальные взломы, чтобы обойти ошибку компилятора, которая не должна быть ошибкой.
Что касается переименования, действительно являющегося просто int, то это один из небольших грязных секретов .NET, который действительно смущает. Позвольте мне объявить перечисление с ограниченным числом возможностей и дайте мне компиляцию для:
Decision fred = (Decision)123;
а затем выведите исключение, если кто-то попробует что-то вроде:
int foo = 123;
Decision fred = (Decision)foo;
ИЗМЕНИТЬ 2:
Несколько человек сделали комментарии о том, что происходит, когда перечисление находится в другой сборке и как это приведет к проблемам. Я хочу сказать, что это поведение, которое, как мне кажется, должно произойти. Если я изменю подпись метода, это приведет к проблемам, моя премия заключается в том, что изменение перечисления должно быть таким же. У меня создается впечатление, что многие люди не думают, что я понимаю о перечислениях в .NET. Я просто думаю, что поведение ошибочно, и я надеялся, что кто-то может знать о какой-то очень неясной функции, которая изменила бы мое мнение о .NET enums.