Есть ли способ заставить мой переключатель / случай провалиться в следующий случай в C #? - PullRequest
14 голосов
/ 10 ноября 2011

Я использую оператор switch / case для обработки некоторых обновлений для развернутого приложения.По сути, я хочу использовать все случаи, чтобы выполнить обновление с текущей работающей версии до последней версии.

Из кричащей на меня Visual Studio я узнал, что C # не позволяет переходить к следующему случаю (именно то, что я пытаюсь сделать).Из этого вопроса я узнал, как делать то, что я хочу делать.Тем не менее, это все еще очевидно ошибка.

То, что я получил, это

switch (myCurrentVersion)
{
    case null:
    case "":
    case "0":
        UpdateToV1();
        goto case "1";
    case "1":
        UpdateToV2();
}

Я получаю следующую ошибку в строке case "1"::

Ошибка 1 Элемент управления не может перейти от одной метки регистра ('case "1":') к другой

Я что-то не так делаю?Как я могу заставить его провалиться?

Ответы [ 4 ]

31 голосов
/ 10 ноября 2011

Вам необходимо добавить оператор break, даже если это последний случай:

switch (myCurrentVersion)
{
    case null:
    case "":
    case "0":
        UpdateToV1();
        goto case "1";
    case "1":
        UpdateToV2();
        break;
}
25 голосов
/ 10 ноября 2011

Это отличный пример того, как плохо сформулированное сообщение об ошибке создает путаницу. Правило C #, которое здесь фактически нарушается, не означает, что управление перешло от одной секции переключателя к другой; Дело в том, что конечная точка каждой секции переключателя не должна быть достижимой. Ошибка по праву должна была быть что-то вроде

Конечная точка секции переключателя для случая "1" не должна быть достижимой; рассмотрите возможность добавления 'break;'

Когда мы вернемся к семантическому анализу операторов switch для проекта Roslyn, я посмотрю, сможем ли мы немного изменить формулировку, чтобы сделать ее более понятной.

Для более подробного анализа этой и связанных с ней проблем см. мою статью на эту тему .

4 голосов
/ 10 ноября 2011

В вашем case "1" филиале нет break.

3 голосов
/ 10 ноября 2011

поставить break; после UpdateToV2();

Не могли бы вы избавиться от goto case "1", так как он все равно провалится?

...