为什么 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;
}
最佳答案
因为你的缩进有误导性,第一个代码实际上是:
var s = "Nice";
switch (s)
{
case "HI":
break;
const string x = "Nice";
case x:
Console.Write("Y");
break;
}
也就是说,x
在 case
语句中声明(尽管在 break
之后),它是有效的。但是,直接在 switch
语句中它是无效的——唯一有效的语句是 case
和 default
。
此外,const
声明在编译时 求值,因此即使有 break
也会定义 x
声明之前。
但是,请注意 Mono C# 编译器不会编译这段代码,它会提示“当前作用域中不存在名称 'x
'”,所以 Mono似乎比 .NET 编译器执行更多检查。但是,我在 C# 标准中找不到任何禁止使用 const
声明的规则,因此我假设 .NET 编译器是正确的,而 Mono 编译器是错误的。
关于c# - 为什么 C# 允许在 case 之后而不是之前的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16694189/