С# Switch/case имеет один и тот же объем?

Возможный дубликат:
Объявление переменной в инструкции switch С#

Я всегда удивляюсь:

когда я пишу:

 switch (temp)
        {
            case "1":
                int tmpInt = 1;
                break;

        }

область case "1": имеет область кода, которая выполняется (до разрыва)

теперь

водопад сверху не может попасть в case of 2, например.:

  switch (temp)
        {
            case "1":
                int tmpInt = 1;

            case "2":

                break;
        }

//Ошибка: возврат прерывания отсутствует.

Итак, я предполагаю, что у них разные области исполнений (case.... break).

так почему эти ошибки появляются?

enter image description here

//переменная конфликта tmpInt определена ниже.

p.s. это просто глупый вопрос, все еще интересный.

Ответ 1

В С# область определяется только фигурными скобками. Если их нет, нет отдельной области. При switch/case, очевидно, нет. То, что вы называете "областью исполнения", не имеет ничего общего с тем, где вы можете ссылаться на переменную. Для надуманного примера:

int x = 1;
goto foo;
// This part gets never executed but you can legally refer to x here.
foo:

Вы можете сделать следующее, хотя, если хотите:

switch (temp)
{
    case "1":
        {
            int tmpint = 1;
            break;
        }
    case "2":
        {
            int tmpint = 1;
            break;
        }
}

Фактически, для некоторых операторов switch я это делаю, потому что это облегчает жизнь, не загрязняя другие case s. Иногда я скучаю по Паскалю; -)

Что касается вашего провала, вы должны сделать это явным в С# с goto case "2".

Ответ 2

Попробуйте это

int tmpInt = 0;
switch (temp)
        {
            case "1":
            case "2":
                tmpInt = 1;
                break;
        }

поэтому, когда случай равен 1 или 2, он установит tmpint на 1

Ответ 3

Раздел 8.5.1 спецификации языка С# говорит:

Объем локальной переменной, объявленной в объявлении локальной переменной, является блоком, в котором происходит объявление. Ошибочно ссылаться на локальную переменную в текстовой позиции, которая предшествует локальному переменному-декларатору локальной переменной. В рамках локальной переменной ошибка времени компиляции объявляет другую локальную переменную или константу с тем же именем.

Блок в этом случае является оператором switch, поскольку блоки определяются скобками.

Ответ 4

Это происходит потому, что вы объявляете локальную переменную с тем же именем в той же области видимости, как и intellisense, когда вы наводите курсор на строку ошибки.

Вот почему вы действительно должны использовать фигурные скобки в каждом случае:

switch(var)
{
    case 1: 
    {
        int temp=0;
    } break;
    case 2:
    {
        int temp=0;
    } break;
}

Это исправляет "проблему" (которая действительно не является проблемой, как работают области действия).

Ответ 5

вы создаете одну и ту же переменную дважды, т.е. int tmpInt = 1;