控制装置如何在不中断c#的情况下从一个开关箱切换到另一个开关箱?

控制装置如何在不中断c#的情况下从一个开关箱切换到另一个开关箱?,c#,switch-statement,C#,Switch Statement,刚刚开始C#,我知道如果至少有一条语句,就不能从一个切换到另一个案例。错误:控制不能从一种情况转到另一种情况 只是为了好玩,我试了一下: char c = 'a'; switch (c) { case 'a': Console.WriteLine("yes"); goto JumpToNextCase; case 'b':

刚刚开始
C#
,我知道如果至少有一条语句,就不能从一个
切换到另一个
案例。错误:
控制不能从一种情况转到另一种情况

只是为了好玩,我试了一下:

        char c = 'a';
        switch (c)
        {
            case 'a':
                Console.WriteLine("yes");
                goto JumpToNextCase;
            case 'b':
                 JumpToNextCase:
                Console.WriteLine("Kiddin me?");
                break;

        }

这就成功了!怎么可能?我现在没有违反从一个案件跳到另一个案件的规则吗?有满意的答案吗

关于失败案例的错误是对事故的保护,而不是对语言的一些基本限制。以前的语言(如C)允许您在没有警告或错误的情况下失败,但是-通常-这是一个bug,您刚刚忘记了
中断
。C#引入了错误以防止这些错误


没有什么能阻止你解决这个问题,事实上你已经做到了。但是,您必须故意这样做,而不是出于偶然,因此(希望)这样做不会引入bug。

它起作用,因为您使用了
goto
语句

goto
重定向程序流,结束案例。您也可以使用
return
(而不是
break
),它可以正常编译

编译器仅在案例没有以某种方式终止(失败)时才进行投诉


我相信你知道这一点,但无论如何,转到几乎从来都不是一个好主意:)

失败是不允许的,主要是因为程序员很容易忘记
中断案例
块。在这种情况下,明确要求运行另一个块,因此这显然不是您偶然做的事情C#只是迫使你更加自信地要求它运行另一个案例,以确保失败不会意外发生。

是的,限制只是为了防止99%的案例中出现意外和错误

然而,如果你想让它工作,你甚至不需要一个标签您可以使用
goto
跳转到不同的
案例

char c = 'a';
switch (c)
{
    case 'a':
        Console.WriteLine("yes");
        goto case 'b';
    case 'b':
        Console.WriteLine("Kiddin me?");
        break;
}
您也可以跳转到
默认值
。C#规范提到:

8.9.3 goto语句goto语句将控制转移到由标签标记的语句

goto-statement:
goto   identifier   ;
goto   case   constant-expression   ;
goto   default   ;
(……)

goto case
语句的目标是紧随其后的switch语句(§8.7.2)中的语句列表,其中包含一个带有给定常量值的
case
标签

(……)

goto default
语句的目标是紧随其后的switch语句(§8.7.2)中的语句列表,其中包含一个
default
标签


你不会从这里掉下去的。您正在
goto
ing一个标签,刚好在下面的
case
中。哇,很酷
goto case'b'
成功了,谢谢,还有规格!谢谢你的回答:)