为什么是休后需要返回收率在一开声明?
-
23-09-2019 - |
题
可以有人告诉我为什么认为,编译器 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节。
"正常的"返回有两个功能:
- 标记的返回值的功能。
- 转移控制的呼叫者。
一ýield返回仅标志着一个返回值;它不会影响的控制流动。后一产量的回声明的程序继续执行在下一个线,其中一个突破是需要在你的样本,正如在任何其他关情况下的发言。
不隶属于 StackOverflow