【问题标题】:Why is break required after yield return in a switch statement?为什么在 switch 语句中的 yield return 之后需要 break?
【发布时间】:2010-03-01 19:46:26
【问题描述】:

谁能告诉我为什么编译器认为break 在下面的代码中yield return 之后是必要的?

foreach (DesignerNode node in nodeProvider.GetNodes(span, node => node.NodeType != NDjango.Interfaces.NodeType.ParsingContext))
{
    switch (node.ErrorMessage.Severity)
    {
        case -1:
        case 0:
            continue;
        case 1:
            yield return new TagSpan<ErrorTag>(node.SnapshotSpan, new ErrorTag(PredefinedErrorTypeNames.Warning));
            break;
        default:
            yield return new TagSpan<ErrorTag>(node.SnapshotSpan, new ErrorTag(PredefinedErrorTypeNames.SyntaxError));
            break;
    }
}

【问题讨论】:

    标签: c# switch-statement break yield-return


    【解决方案1】:

    因为 yield return 只是迭代器生成器的语法糖,而您实际上并没有退出任何方法。并且 C# 不允许在 switch 语句中掉线(而且它看起来并不像你想要的那样)。

    【讨论】:

      【解决方案2】:

      为什么在 switch 语句中 return yield 后需要 break?

      问题假设了一个不正确的前提。 不需要在 switch 语句中的 yield return 之后使用 break 语句。例如:

      switch(x)
      {
      case 123:
          yield return 456;
          M();
          throw new Exception();
      case 789: // and so on
      

      这里我们在 switch 语句中有一个 yield return,它后面没有一个 break。接着是对 M() 的调用,然后是 throw 语句。这是完全合法的。

      真正的规则是开关部分的终点不能到达。

      break、continue、return、goto、return 和 throw 的端点不可达,因为所有这些语句都分支到另一个位置并且不会返回,因此紧随它们的代码令牌不可达。这与方法调用形成对比,方法调用分支到另一个位置然后返回,或者 yield return 将控制权转移回调用者;当调用者将控制权交还给迭代器块时,控制权会从 yield return 停止的地方开始,因此 yield return 的终点是可以到达的。

      如果您对此主题感兴趣,我建议您阅读规范的第 8.1 节。

      【讨论】:

      • 感谢您的详细解释。我很抱歉我的问题不够清楚。 “开关部分的末端不能到达”的概念对我来说非常清楚。我的困惑在于收益率回报——出于某种原因,我认为它的分支方式与常规回报相同。我错了——我错了
      【解决方案3】:

      “正常”返回有两个功能:

      1. 标记函数的返回值。
      2. 将控制权转移给调用者。

      yield 返回仅标记返回值;它不影响控制流。在 yield return 语句之后,程序在下一行继续执行,在您的示例中需要中断,就像在任何其他 switch-case 语句中一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 2018-10-14
        • 2011-01-22
        • 2023-02-10
        • 2021-12-01
        相关资源
        最近更新 更多