rtu*_*ner 64 .net c# switch-statement
为什么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;
}
Kon*_*lph 119
因为你的缩进是误导性的,所以第一个代码实际上是:
var s = "Nice";
switch (s)
{
    case "HI":
        break;
        const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}
也就是说,x在声明中case声明(虽然在a之后break),它在有效的地方.然而,直接在里面switch的语句是无效的-唯一有效的语句有case和default.
此外,const声明在编译时进行评估,因此x即使break之前有声明,也会定义声明.
但请注意,Mono C#编译器不会编译此代码,它抱怨" x当前作用域中不存在"名称' ,因此Mono似乎实现了比.NET编译器更多的检查.但是,我在C#标准中找不到禁止使用该const声明的任何规则,因此我假设.NET编译器是正确的并且Mono编译器是错误的.
因为语言规范不允许在您的交换机中直接使用const(仅允许大小写和默认值):
switch (expression)
{
   case constant-expression:
      statement
      jump-statement
   [default:
      statement
      jump-statement]
}
哪里:
expression:整数或字符串类型表达式.
statement:如果控件转移到大小写或默认情况下要执行的嵌入语句.
jump-statement:将控制权移出案件主体的跳转声明.
constant-expression:根据此表达式的值将控制转移到特定情况.
在第一种情况下,const是案例逻辑的一部分.const只会起作用,因为它是在编译时而不是在运行时重写的.