Я полагаю, что это имеет отношение к полному объему переменной, это - объем блочного уровня, который определяется на уровне коммутатора.
Лично, если Вы устанавливаете значение к чему-то в переключателе в Вашем примере для него для реального имения какую-либо выгоду, Вы хотели бы объявить его вне переключателя так или иначе.
Если Вы хотите переменную, ограниченную по объему к особому случаю, просто включаете случай в его собственный блок:
switch (Type)
{
case Type.A:
{
string variable = "x";
/* Do other stuff with variable */
}
break;
case Type.B:
{
string variable = "y";
/* Do other stuff with variable */
}
break;
}
Да, объемом является блок целостного коммутатора - к сожалению, IMO. Можно всегда добавлять фигурные скобки в единственном случае, однако, для создания меньшего объема. Что касается того, создаются ли они/выделяются - стековый фрейм имеет достаточно пространства для всех локальных переменных в методе (не принимающий во внимание сложности полученных переменных). Это не похоже на то пространство, выделяется во время осуществления метода.
Поскольку их объем в блоке переключателя. Спецификация языка C# указывает следующее:
объемом локальной переменной или постоянный объявленный в блоке переключателя является блок переключателя.
Переменные действительно совместно используют объем в компиляторе C#. Однако объем не существует таким же образом в CIL. Что касается фактического создания / инициализация... модель памяти.NET позволяет компилятору переместиться, чтения / пишет немного, пока простые правила сопровождаются, если переменная не отмечена как энергозависимый .
Инициализация происходит в случае, но объявление эффективно сделано во главе объема. (Psuedo-код)
switch (Type)
{
string variable;
case Type.A:
variable = "x";
break;
case Type.B:
variable = "y";
break;
}