【问题标题】:Switch Fall Through Not Working as Expected [duplicate]Switch Fall through not working as expected [重复]
【发布时间】:2014-05-20 16:53:09
【问题描述】:

我有一个开关块,但它的行为与我预期的不同。当我在这个论坛上查看类似问题时,答案并没有直接解决我的问题,但似乎证实了我的想法。请告诉我哪里出错了。另外,我知道我可以用另一种方式完成这个,而且可能是更好的方式,但这不是我要问的。我想知道我对跌倒的理解哪里有问题。

  switch (ncPointType)
        {
            case "MSD":
                adjustDisabled = LastToken(initLine, adjustDisabled);//fall through intentional
            case "MSI":
            case "BI":
                latchingPoint = FirstToken(initLine, latchingPoint);
                break;

现在,根据我的理解,如果 ncPointType == "MSD",则应该设置adjustDisabled 和latchingPoint。如果是“MSI”,应该设置latchingPoint。但是编译器将第一个“case”标记为错误“Control cannot fall through from a case label ('case "MSD":') to another. 为什么这段代码无效?

【问题讨论】:

  • 这可能会回答你的问题:link
  • 错误信息的哪一部分不清楚? C# 中不允许跌倒
  • @BenAaronson:那为什么“MSI”案例的失败可以?
  • @user3642601 查看我在第二条评论中链接到的问题的第一个答案
  • 您的错误在于认为 MSI 和 BI 是两个不同的开关部分,由空的开关盒主体隔开。从 MSI 到 BI 没有“失败”,因为它们是相同的部分,而不是两个不同的部分,它们之间是空白的

标签: c# switch-statement


【解决方案1】:

在 C# 中,您必须明确地留下有问题的 case 部分。您可以在第一部分的末尾使用goto case "MSI";

当然,switch 块的一部分也可以以breakreturnthrow、无限循环(C# 编译器可以确定为无限)等结尾。

【讨论】:

  • 感谢您实际阅读我的问题,因为其他一些答案显然没有。您的答案有效,但是为什么在“MSD”而不是“MSI”的情况下需要使用goto?我知道“MSD”下有一个声明,但我认为在声明之后它会继续失败而没有问题。这对我来说没有意义。
  • 你应该阅读这个:msdn.microsoft.com/en-us/library/aa664749%28v=vs.71%29.aspx 特别是以“多个标签允许在一个开关部分”开头的部分。
  • @user3642601 在 C# 中,一个 switch 部分可以有多个标签。您的示例只有两个“部分”。 “标签”case "MSI"case "BI" 属于同一部分。一个部分有多个标签不被认为是失败的。不允许跌倒。
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2015-09-12
  • 2017-05-09
相关资源
最近更新 更多