【发布时间】:2015-07-30 12:31:34
【问题描述】:
请考虑以下非常小的方法-:
IEnumerable<ObjectTest> CreateObjectList()
{
bool aTest = false;
ObjectTest anObject = null;
if (aTest == true)
{
foreach (var item in aTestList)
{
yield return anObject;
}
}
}
我觉得这段代码不应该编译。由于布尔测试失败,有些路径不会返回。编译器应该报告-:
并非所有代码路径都返回值。
但事实并非如此——有人可以解释一下吗?
(.NET 4.0)
理查德
【问题讨论】:
-
如果
yield return从未被命中,则返回不返回任何元素的迭代器。因此yield returns可能永远不会返回null的方法。 -
如果它让你感觉更好,想象一下在最后一行有一个隐含的
yield break; -
HimBromBeere 非常感谢您的快速回复 - 您能否详细说明这是为什么以及在 C# 规范中的位置?
-
10.14.4.1:遇到迭代器体结束时:枚举器对象的状态变为after。 MoveNext 方法向其调用者返回 false,表示迭代完成。
-
@RichardHill 第二个 :-) 你必须先理解 yield 的工作原理,然后一切就变得清晰了。您编写的代码由编译器进行了很大的转换。 “真正的”代码完全不同。因此,您观察到的是代码编写方式(以及 10.14.4.1)的自然副作用
标签: c# visual-studio yield