控制器如何从一个开关盒转到另一个开关盒而没有中断c#?

joe*_*han 4 c# switch-statement

刚刚开始C#,我知道switch如果至少有一个陈述,你不能从一个案件转到另一个案件.错误:Control cannot fall through from one case to another.

只是为了有趣的东西,我尝试了这个:

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

        }
Run Code Online (Sandbox Code Playgroud)

这有效!怎么可能?我现在没有违反从一个案件跳到另一个案件的规则吗?任何令人满意的答案?

Ada*_*ght 8

关于案件堕落的错误是对事故的保护,而不是对语言的一些基本限制.以前的语言如C让你没有警告或错误,但通常 - 这是一个错误,你只是忘记了break.C#引入了错误以防止这些错误.

没有什么可以阻止你解决它,就像你有的一样.但是,你必须故意这样做,而不是偶然,所以(希望)不会通过这样做来引入错误.


Mar*_*zek 8

是的,限制只是为了防止在99%的情况下出现意外和错误.

但是,如果您认为自己希望它能够正常工作,那么您甚至不需要使用标签来使其正常工作.你可以goto用来跳转到不同的case!

char c = 'a';
switch (c)
{
    case 'a':
        Console.WriteLine("yes");
        goto case 'b';
    case 'b':
        Console.WriteLine("Kiddin me?");
        break;
}
Run Code Online (Sandbox Code Playgroud)

你也可以跳转到default.C#规范提到:

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

goto-statement:
goto   identifier   ;
goto   case   constant-expression   ;
goto   default   ;
Run Code Online (Sandbox Code Playgroud)

(......)

goto case语句的目标是直接封闭的switch语句(第8.7.2节)中的语句列表,其中包含case具有给定常量值的标签.

(......)

goto default语句的目标是直接包含的switch语句(第8.7.2节)中的语句列表,其中包含default标签.