Ответ 1
Вам нужно добавить оператор break
, даже если это последний случай:
switch (myCurrentVersion)
{
case null:
case "":
case "0":
UpdateToV1();
goto case "1";
case "1":
UpdateToV2();
break;
}
Я использую оператор switch/case для обработки некоторых обновлений для развернутого приложения. В принципе, я хочу, чтобы с помощью сверток делал обновление от текущей текущей версии до самой новой версии.
Из Visual Studio, кричащей на меня, я узнал, что С# не позволяет пропустить следующий случай (именно то, что я пытаюсь сделать). Из этого вопроса я узнал, как делать то, что я хочу делать. Однако, по-видимому, это ошибка.
У меня есть
switch (myCurrentVersion)
{
case null:
case "":
case "0":
UpdateToV1();
goto case "1";
case "1":
UpdateToV2();
}
Я получаю следующую ошибку в строке case "1":
:
Ошибка 1 Контроль не может провалиться с одного ярлыка случая ( "случай" 1 ":" ) на другой
Я что-то делаю неправильно? Как я могу заставить его провалиться?
Вам нужно добавить оператор break
, даже если это последний случай:
switch (myCurrentVersion)
{
case null:
case "":
case "0":
UpdateToV1();
goto case "1";
case "1":
UpdateToV2();
break;
}
Это отличный пример того, как плохо сформулированное сообщение об ошибке создает путаницу. Правило С#, которое на самом деле нарушено здесь, заключается не в том, что контроль прошел от одного раздела коммутатора к другому; это то, что конечная точка каждой секции переключения не должна достижима. Ошибка, по правам, должна была быть чем-то вроде
Конечная точка секции переключения для случая "1" не должна достижима; рассмотрим добавление 'break;'
Когда мы перейдем к семантическому анализу операторов switch для проекта Roslyn, я посмотрю, можем ли мы изменить формулировку этого немного, чтобы быть более понятным.
Подробнее об этом и связанных с ним вопросах см. мою статью по этому вопросу.
У вас нет break
в ветки case "1"
.
поместите a break;
после UpdateToV2();
Не могли бы вы избавиться от goto case "1"
, поскольку он все равно провалится?