C# 什么';允许在switch语句中使用任意标签的原因是什么?

C# 什么';允许在switch语句中使用任意标签的原因是什么?,c#,language-lawyer,C#,Language Lawyer,编译以下代码: int a = 0; switch (a) { case 1: return; defau1t: // note the typo return; } 因为defau1t被解释为一个标签 但在下列情况下: switch (a) { defau1t: return; } 编译器正确识别错误: 错误CS1525:意外符号defau1t',应为}',case',或default:' 为什么呢?如果s

编译以下代码:

int a = 0;

switch (a)
{
    case 1:
        return;
    defau1t:      // note the typo
        return;
}
因为
defau1t
被解释为一个标签

但在下列情况下:

switch (a)
{
    defau1t:
        return;
}
编译器正确识别错误:

错误CS1525:意外符号
defau1t',应为
}',
case',或
default:'

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


<> PTEN:对于C++和java的类似代码片段,也可以看到同样的问题。

< P>我想你是在错误地看待这个问题。这并不是说有一个特殊的例外被允许,而是没有一个特殊的例外被禁止

有一条规则是
开关
块必须以
大小写
默认
标签开头,但除此之外,任何有效代码都可以是块的一部分

包括其他标签

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

C#以这种方式工作,因为这是规范中的内容。C#规范的第8.7.2节定义了switch语句的语法。值得注意的是,如果开关块不是空的,它必须包含一个开关段,开关段必须以开关标签开头,即
大小写:
默认值:
。在第二个示例中,您有一个非空的switch块,它不包含有效的switch节,因此不是有效的语句


为了稍微引导Eric Lippert,在开关块中不允许标记语句是一种需要构思、提议、设计、指定、开发、测试、记录和发布的语言特性。我的猜测是,这一特性可能永远不会被人们所接受

是否有任何地方不允许使用标签?我不认为有人特别决定允许在switch中使用标签。我想,如果不在常规的“statement”
goto
之外再加上特殊的“switch\u only\u statement”,那么禁止在
switch
中使用标签是没有意义的,不是吗?标签defau1t:不是“开关”标签。这是一个“goto”标签。在一个开关内有goto语句是完全合法的。第二个开关没有“开关”标签,因此不合法。请注意,提供的代码确实会产生两个警告。一个是关于无法访问的代码,另一个是关于未引用的标签。虽然一个错误可能更可取,但如果我的代码没有像我预期的那样工作,警告是我首先要寻找的东西之一。看来你准确地读懂了我的心思。我确实认为
switch
块是一种特殊的东西,具有预定义的cases和内部case块结构。你的观点澄清了这一点。我仍然会争论这是否正确——存在一个不一致性:fall-throup是不允许的,因为它可能会令人困惑,因此为了代码可读性,存在一些额外的特殊规则。看来这是同样的情况。@BartoszKP失败确实是不允许的。不过,这在语法上并不是一个特殊的例外。前一个
案例
分支不需要以
中断结束:它也可能以一个“无限”循环(可能是一个内部的
返回
语句)结束,或者直接以
返回
语句结束,或者以
转到
结束,或者以
抛出
结束,或者任何其他实际上不会导致失败的语句结束。当编译器看到
案例
时,它会检查除了从
开关
之外,是否还有其他方法可以到达该
案例
。我不知道如何在不拒绝有效有用代码的情况下扩展到检查普通标签。谢谢您的输入。然而,大多数语言都是按自己的方式“工作”的,因为它们是这样产生的,也因为它们的语法。2) 每一种语言特性都需要构思、提出、设计、指定、开发、测试、记录和发布。这两种说法实际上都适用于编程环境中的任何东西,因此它们似乎没有多大帮助。@BartoszKP:事实上,你的问题承认了一个没有帮助的答案,这是模糊问题的一个功能。如果你想得到更好的答案,可以问一个更精确的问题。“为什么这种语言没有功能X”的唯一答案是“因为功能X不在规范中”。“为什么功能X不在规范中”的唯一答案是,功能X在语言的设计和实现中没有通过这些步骤之一。如果你问“为什么feature X没有通过这些步骤”,那么你从语言设计团队以外的任何人那里得到的任何答案都将是纯粹的猜测。@EricLippert hvd的答案对我来说似乎很好。@BartoszKP:公认的答案是,这个问题基于错误的推理,拒绝了这个问题,回答了你没有问过的不那么模糊的问题。