Код: Выделить всё
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";
}
}
}
Принимая во внимание, что если компилятор позволит мне использовать мой код выше, он может затем определить, что у нас есть проблема, как мой оператор case больше не будет охватывать все значения из моего перечисления. Конечно, для меня это звучит намного безопаснее.
Для меня это настолько в корне неправильно, что я хочу знать, просто ли это что-то, чего мне не хватает, или у нас просто есть быть очень осторожными, когда мы используем перечисления в операторах переключения?
РЕДАКТИРОВАТЬ:
Я знаю, что могу вызывать исключения в стандартном или добавить возврат за пределами переключателя, но это все равно, по сути, хаки, позволяющие обойти ошибку компилятора, которая не должна быть ошибкой.
Что касается перечисления, на самом деле это просто int, это один из маленьких грязных секретов .NET, который на самом деле очень смущает. Позвольте мне объявить перечисление с конечным числом возможностей и дать мне компиляцию для:
Код: Выделить всё
Decision fred = (Decision)123;
Код: Выделить всё
int foo = 123;
Decision fred = (Decision)foo;
Несколько человек оставили комментарии о том, что происходит, когда перечисление находится в другой сборке, и как это может привести к проблемам. Я хочу сказать, что именно такое поведение, по моему мнению, и должно произойти. Если я изменю сигнатуру метода, это приведет к проблемам, я предполагаю, что изменение перечисления должно быть таким же. У меня такое впечатление, что многие люди думают, что я ничего не понимаю в перечислениях в .NET. Я просто думаю, что такое поведение неправильное, и я надеялся, что кто-то мог знать о какой-то очень малоизвестной функции, которая изменила бы мое мнение о перечислениях .NET.
Подробнее здесь: https://stackoverflow.com/questions/109 ... umerations