为什么在一个case语句中声明的变量在其他情况下的范围内?

Cod*_*ody 6 c# compiler-construction switch-statement

为什么以下代码编译?我希望它会抱怨foo没有在第二个案例分支中宣布.编译器是否处理声明以使其适用于所有情况?

using System;

namespace Scratch
{
    class Scratch
    {
        public static void Main()
        {
            var x = 2;
            switch (x)
            {
                case 1:
                    var foo = "one";
                    Console.Out.WriteLine(foo);
                    break;
                case 2:
                    foo = "two"; // is foo in scope here?
                    Console.Out.WriteLine(foo);
                    break;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

为什么以下代码编译?

因为这个语言是在这个特定区域以脑死亡的方式设计的:(

局部变量的范围是声明它的,并且在声明之后可以在词法上随时访问它.

不,我也不会那样设计语言.我不是C#中开关设计的粉丝......


Quu*_*one 8

@JonSkeet所说的是正确的:C/C++/C#意义上的"块"与逻辑意义上的"案例"不同.但他没有提到修复问题的"最佳实践":如果你想在switch语句的一个case中声明一个变量,最好将整个逻辑"case"包装在一个块中.这样,编译器识别的逻辑"情况"和实际"范围"将是同一个.

public static void Main()
{
    var x = 2;
    switch (x)
    {
        case 1: {  // notice these braces I added
            var foo = "one";
            Console.Out.WriteLine(foo);
            break;
        }
        case 2:
            foo = "two"; // hooray! foo is no longer in scope here
            Console.Out.WriteLine(foo);
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)