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)
为什么以下代码编译?
因为这个语言是在这个特定区域以脑死亡的方式设计的:(
局部变量的范围是声明它的块,并且在声明之后可以在词法上随时访问它.
不,我也不会那样设计语言.我不是C#中开关设计的粉丝......
@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)