С# 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;