有没有办法让我的开关/案例落到C#的下一个案例中?

yoo*_*er8 14 c# switch-statement

我正在使用switch/case语句来处理已部署应用程序的一些更新.基本上,我想通过案例来执行从当前运行版本到最新版本的更新.

从Visual Studio对我大喊大叫,我了解到C#不允许进入下一个案例(正是我想要做的).从这个问题,我学会了如何做我想做的事.但是,它仍然显然是一个错误.

我得到的是

switch (myCurrentVersion)
{
    case null:
    case "":
    case "0":
        UpdateToV1();
        goto case "1";
    case "1":
        UpdateToV2();
}
Run Code Online (Sandbox Code Playgroud)

我在线上收到以下错误case "1"::

错误1控件不能从一个案例标签('case"1":')转到另一个案例标签

难道我做错了什么?我怎么能强迫它掉下来?

Mar*_*ers 31

您需要添加一个break语句,即使它是最后一种情况:

switch (myCurrentVersion)
{
    case null:
    case "":
    case "0":
        UpdateToV1();
        goto case "1";
    case "1":
        UpdateToV2();
        break;
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 25

这是一个很好的例子,说明措辞不当的错误信息会造成混淆.这里实际违反的C#规则并不是控件从一个开关部分落到另一个开关部分; 这是每个交换机部分的终点必须是不可达的.权利的错误应该是这样的

情况"1"的开关部分的端点必须不可达; 考虑添加'break;'

当我们重新审视Roslyn项目的switch语句的语义分析时,我会看到我们是否可以更改一下这一点的措辞,以便更清楚.

有关此问题和相关问题的更多分析,请参阅我关于此主题的文章.

  • @EdS.:假设我们让break成为可选的.**具有C背景的人将编写期望直通工作的程序.**但它不会,编译器也不会告诉他们.使其成为可选项使语言具有"陷阱".我们正在努力使C#中的"陷阱"数量保持在低水平.另外,我们*不*要求你一遍又一遍地写"休息".您可以改为编写"throw"或"return"或"goto",或"while(true){}" - 就编译器而言,其中任何一个都与中断一样好. (8认同)
  • 好的,我必须问,因为你在这里,我一直在想; 为什么不是'break`隐含的?不允许跌倒,所以为什么要我一遍又一遍地写"break"?如果通过某些关键字明确地做到这一点,我会喜欢它,但是如果不这样做,为什么不给我一点打字呢?在这种情况下,您还需要明确允许空案例块的落实,但这似乎不太常见. (2认同)

Ed *_* S. 5

breakcase "1"分支没有。