控制装置如何在不中断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
),它可以正常编译
编译器仅在案例没有以某种方式终止(失败)时才进行投诉
我相信你知道这一点,但无论如何,转到几乎从来都不是一个好主意:)失败是不允许的,主要是因为程序员很容易忘记中断这可能是一个bug,因为他们从未打算运行第二个案例块。在这种情况下,明确要求运行另一个块,因此这显然不是您偶然做的事情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'
成功了,谢谢,还有规格!谢谢你的回答:)