什么';这就是允许在switch语句中使用任意标签的原因
本文关键字:语句 任意 标签 switch 什么 | 更新日期: 2023-09-27 18:22:01
编译以下代码:
int a = 0;
switch (a)
{
case 1:
return;
defau1t: // note the typo
return;
}
因为CCD_ 1被解释为CCD_。
但是,在以下情况下:
switch (a)
{
defau1t:
return;
}
编译器正确地识别了错误:
错误CS1525:意外的符号
defau1t', expecting
}',case', or
默认值:'
为什么?如果允许在switch
语句中使用任意标签会导致(看似)不连贯的行为,这是什么原因?
旁注:对于C++和Java的类似代码段,也可以观察到同样的问题。
我认为您对此的看法是错误的。这并不是说有一个特殊的例外允许它,而是没有任何特殊的例外禁止它
有一条规则是,switch
块必须以case
或default
标签开头,但除此之外,任何有效代码都可以是块的一部分。
包括其他标签。
不允许这样做会使语言更难理解,会使编译器更难编写,而且会有一些好处,但好处很小。
C#以这种方式工作,因为这就是规范中的内容。C#规范的8.7.2节定义了switch语句的语法。值得注意的是,如果开关块不为空,则它必须包含一个开关段,并且开关段必须以开关标签(即case <constant expression>:
或defau1t
0)开头。在第二个示例中,您有一个非空的开关块,它不包含有效的开关节,因此不是有效的语句。
为了稍微引导Eric Lippert,在开关块中不允许标记语句是一种需要构思、提出、设计、指定、开发、测试、记录和交付的语言功能。我的猜测是,这个功能可能从未被设想过。