可以有人告诉我为什么认为,编译器 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语句返回收率之后需要休息?

在问题设一个不正确的前提。 break语句是在switch语句的收率返回后需要。例如:

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

下面我们具有其中后面没有休息switch语句的收率回报。其次是对M()的调用,然后throw语句。这是完全合法的。

在实际的规则是,一个开关部分的结束点不能是可达

这是一个突破,继续回,跳转,返回和抛出终点不可达,因为所有这些语句分支到另一个位置,并且不回来,让代码标记紧跟在他们不可达。这与,比如说,一个方法调用,将跳转到另一位置,然后回来,或产率为回报,这将控制转移返回给调用者对比度;当主叫方将控制转移回到迭代器块,控制将拿起收率返回离开的位置,因此,因此产率返回的结束点是可到达的。

如果这个主题兴趣你,我建议阅读了本说明书的第8.1节。

"正常的"返回有两个功能:

  1. 标记的返回值的功能。
  2. 转移控制的呼叫者。

一ýield返回仅标志着一个返回值;它不会影响的控制流动。后一产量的回声明的程序继续执行在下一个线,其中一个突破是需要在你的样本,正如在任何其他关情况下的发言。

scroll top