首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在switch语句中,在yield之后需要中断?

为什么在switch语句中,在yield之后需要中断?
EN

Stack Overflow用户
提问于 2010-03-02 03:46:27
回答 3查看 4.8K关注 0票数 24

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

代码语言:javascript
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-02 03:50:02

因为对于迭代器生成器来说,yield只是一个语法糖,而您实际上并没有退出任何方法。而且C#不允许在switch语句中使用漏洞法(而且看起来您也不想在这里使用它)。

票数 31
EN

Stack Overflow用户

发布于 2010-03-02 07:27:04

为什么在switch语句中的return yield之后需要中断?

这个问题假设了一个错误的前提。在switch语句中,在yield之后不需要break语句。例如:

代码语言:javascript
复制
switch(x)
{
case 123:
    yield return 456;
    M();
    throw new Exception();
case 789: // and so on

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

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

break、continue、return、goto、return和throw的结束点是不可达的,因为所有这些语句都分支到另一个位置并且不再返回,因此紧跟在它们后面的代码令牌是不可达的。这与方法调用相反,方法调用转移到另一个位置,然后返回,或者yield,它将控制转移回调用者;当调用者将控制转移回迭代器块时,控制将从yield离开的地方开始,因此yield的终点是可以到达的。

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

票数 17
EN

Stack Overflow用户

发布于 2010-03-02 03:52:47

“正常”返回有两个函数:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2358568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档