什么';这就是允许在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语句中使用任意标签的原因

我认为您对此的看法是错误的。这并不是说有一个特殊的例外允许它,而是没有任何特殊的例外禁止它

有一条规则是,switch块必须以casedefault标签开头,但除此之外,任何有效代码都可以是块的一部分。

包括其他标签。

不允许这样做会使语言更难理解,会使编译器更难编写,而且会有一些好处,但好处很小。

C#以这种方式工作,因为这就是规范中的内容。C#规范的8.7.2节定义了switch语句的语法。值得注意的是,如果开关块不为空,则它必须包含一个开关段,并且开关段必须以开关标签(即case <constant expression>:defau1t0)开头。在第二个示例中,您有一个非空的开关块,它不包含有效的开关节,因此不是有效的语句。

为了稍微引导Eric Lippert,在开关块中不允许标记语句是一种需要构思、提出、设计、指定、开发、测试、记录和交付的语言功能。我的猜测是,这个功能可能从未被设想过。