在C#中,有没有一种方法使我的switch/case执行后继续执行下一个case?

15

我正在使用 switch/case 语句处理已部署应用程序的一些更新。基本上,我想按照顺序执行每个 case,以将当前运行版本更新到最新版本。

从 Visual Studio 的警告中,我了解到 C# 不允许跨越到下一个 case(这正是我要做的)。从这个问题中,我学会了如何实现我的需求。然而,这似乎仍然是一个错误。

我目前的代码如下:

switch (myCurrentVersion)
{
    case null:
    case "":
    case "0":
        UpdateToV1();
        goto case "1";
    case "1":
        UpdateToV2();
}

我在 case "1": 这行代码中遇到了以下错误:

Error 1 Control cannot fall through from one case label ('case "1":') to another

我做错了什么?如何强制它继续执行下去?

4个回答

33

即使是最后一个情况,你也需要添加一个 break 语句:

switch (myCurrentVersion)
{
    case null:
    case "":
    case "0":
        UpdateToV1();
        goto case "1";
    case "1":
        UpdateToV2();
        break;
}

28

这是一个糟糕的错误提示信息会导致混乱的很好例子。实际上在 C# 中被违反的规则不是控制权从一个 switch 段落跌落到另一个,而是每个 switch 段落的终点必须不可到达。该错误的正确提示应该像这样:

case "1" 的 switch 段落终点不可到达,请考虑添加 'break;'

当我们重新审查 Roslyn 项目中 switch 语句的语义分析时,我会尽力使错误提示更加清晰明了。

有关此问题及相关问题的更多分析,请参见我的文章


2
好的,我必须问一下,因为你在这里,而且我一直很好奇; 为什么break不是隐式的呢?不允许穿透,那么为什么要让我一遍又一遍地写break呢?如果可以通过某个关键字显式地允许穿透,那么我会很喜欢它,但除此之外,为什么不帮我省点打字呢?在这种情况下,您还需要明确允许空case块的穿透,但这似乎是一个不太常见的情况。 - Ed S.
8
假设我们将break语句变成可选的,那么有C语言背景的人会认为这种语法中fall-through会正常工作,但实际上它并不会,而且编译器也不会告诉他们。这种可选性会让该语言出现“坑”,而我们正在努力让C#中出现的“坑”数量尽可能少。此外,我们不要求您多次编写"break"语句。您可以选择编写"throw"、"return"、"goto"或"while(true) {}"等任意语句,这些语句对于编译器来说与"break"一样好。 - Eric Lippert
@EdS.: 顺便说一下,我经常被问到这样的问题:“编译器可以推断出我的意思,那为什么它不是可选的?”每个问题都需要判断;没有硬性规定何时适合省略。例如,请参见https://dev59.com/kHE85IYBdhLWcg3wvGOm#2632844和https://dev59.com/AlfUa4cB1Zd3GeqPIHfX#6099409。 - Eric Lippert
当然,那就是我想的(即尽可能保持与C语言语义相似)。我知道像这样的事情总是需要进行判断。是的,我知道你可以使用其他语句来防止“穿透”,我只是对这种情况感兴趣。好的,谢谢答案。 - Ed S.
1
如果你想要最小化意外情况,允许 fall-through 会更加合适。这是 C 背景的人们所期望的。 - Suncat2000

5

你的 case "1" 分支中缺少 break 语句。


4

UpdateToV2(); 后加上 break;

您不能去掉 goto case "1",因为它会自动进入那个 case。


2
不好意思,C#是不允许这样的。我认为这是因为很多被省略的break;都是无意中的,他们试图防止人们犯错误(虽然我觉得发出一个警告会比报错更合适)。 - yoozer8
@Jim:是的,我认为break应该是隐式的,并且允许通过某些关键字显式地使用fallthrough。 - Ed S.
1
@Ed S. 要求明确的 goto 的原因是为了重新排序情况时不改变代码的含义。 - phoog
1
@phoog: 是的,就像它被设计的那样。我的意思是说,不需要显式地写上 break 语句,程序应该默认为无 fallthrough 的模式。如果我需要使用 fallthrough 模式,则需要使用某些关键字来允许它。 - Ed S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接