Почему C# разрешает операторы после случая, но не до него?
почему C# позволяет этой:
var s = "Nice";
switch (s)
{
case "HI":
break;
const string x = "Nice";
case x:
Console.Write("Y");
break;
}
а не этой:
var s = "Nice";
switch (s)
{
const string x = "Nice";
case x:
Console.Write("Y");
break;
}
3 ответа:
потому что ваш отступ вводит в заблуждение, первый код на самом деле:
var s = "Nice"; switch (s) { case "HI": break; const string x = "Nice"; case x: Console.Write("Y"); break; }то есть
xобъявляется внутри acaseзаявление (хотя послеbreak), где она действует. Однако, непосредственно внутриswitchзаявление это недопустимо – единственные допустимые утверждения естьcaseиdefault.кроме того,
constдекларации оцениваются во время компиляции, так чтоxопределяется, даже если естьbreakзаявление до.однако обратите внимание, что компилятор Mono C#не будет компилироваться этот код, он жалуется, что "имя ‘
x’ не существует в текущей области", поэтому Mono, похоже, реализует больше проверок, чем компилятор .NET. Однако я не могу найти никаких правил в стандарте C#, которые запрещают это использованиеconstобъявление поэтому я предполагаю, что компилятор .NET прав, а компилятор Mono ошибается.
потому что спецификация языка не позволяет const непосредственно в вашем коммутаторе (разрешены только case и default):
switch (expression) { case constant-expression: statement jump-statement [default: statement jump-statement] }где:
expression:целочисленное или строковое выражение типа.statement:встроенный оператор(Ы), который будет выполняться, если управление передается в случае или по умолчанию.jump-statement:оператор перехода, который передает управление из дела тело.constant-expression:управление передается в конкретный случай в соответствии со значением этого выражения.в первом случае const является частью вашей логики случая. Const будет работать только потому, что он переписывается в compiletime, а не во время выполнения.
... потому что
switchэтоjump_to_the_label_matchig(s) { label1: ... done_quit_this; label2: ... done_quit_this; d'oh: ... done_quit_this; }а не
now_jump_to_the_label_matchig(s) { le'mme_wander_around_doing_things_that_could_have_been_done_before_me; label1: ... done_quit_this; label2: ...бьюсь об заклад, что если бы это было разрешено, вы бы нашли людей, готовых делать все свои программы там : -)