在switch语句中允许任意标签的原因是什么?

Bar*_*zKP 5 c# language-lawyer

以下代码编译:

int a = 0;

switch (a)
{
    case 1:
        return;
    defau1t:      // note the typo
        return;
}
Run Code Online (Sandbox Code Playgroud)

因为defau1t被解释为goto标签.

但是在以下情况中:

switch (a)
{
    defau1t:
        return;
}
Run Code Online (Sandbox Code Playgroud)

编译器正确识别错误:

错误CS1525:意外符号defau1t', expecting}',case', or默认值:'

这是为什么?switch如果它导致(看似)不连贯的行为,那么在语句中允许任意标签的原因是什么?

旁注:对于C++和Java的类似代码片段,可以观察到同样的问题.

小智 9

我觉得你看错了.并不是说允许它是一个特殊的例外,它没有特别的例外来禁止它.

有一个规则,switch块必须以a casedefaultlabel 开头,但除此之外,任何有效的代码都可以是块的一部分.

包括其他标签.

不允许这样做会使语言更难理解,会使编译器更难编写,并且会带来一些好处,这种好处只是次要的.