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;
}
Run Code Online (Sandbox Code Playgroud)
但不是这个:
var s = "Nice";
switch (s)
{
const string x = "Nice";
case x:
Console.Write("Y");
break;
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 119
因为你的缩进是误导性的,所以第一个代码实际上是:
var s = "Nice";
switch (s)
{
case "HI":
break;
const string x = "Nice";
case x:
Console.Write("Y");
break;
}
Run Code Online (Sandbox Code Playgroud)
也就是说,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]
}
Run Code Online (Sandbox Code Playgroud)
哪里:
expression:
整数或字符串类型表达式.
statement:
如果控件转移到大小写或默认情况下要执行的嵌入语句.
jump-statement:
将控制权移出案件主体的跳转声明.
constant-expression:
根据此表达式的值将控制转移到特定情况.
在第一种情况下,const是案例逻辑的一部分.const只会起作用,因为它是在编译时而不是在运行时重写的.
归档时间: |
|
查看次数: |
2168 次 |
最近记录: |