请考虑下面的小方法:
IEnumerable<ObjectTest> CreateObjectList()
{
bool aTest = false;
ObjectTest anObject = null;
if (aTest == true)
{
foreach (var item in aTestList)
{
yield return anObject;
}
}
}
字符串
我觉得这段代码不应该编译。有一些路径不返回布尔测试失败。编译器应该报告-:
并非所有代码路径都返回值。
但事实并非如此-有人能解释一下吗?
(.NET 4.0)
理查德
4条答案
按热度按时间azpvetkf1#
由于
yield return
在任何情况下都将返回一个迭代器,因此保证永远不会返回null
。因此,yields
的方法总是有一个返回值,即迭代器。迭代器是否返回任何元素在这里无关紧要。也许this和this也很有趣。
uidvcgyl2#
使用
yield return
并不意味着它涵盖了yield return
范围之外的所有代码路径。扩展一下HimBromBeere在评论中所说的话,请考虑一下:
字符串
这基本上就是你所做的,只允许从内部处理代码的
foreach
部分。上面的代码将抛出相同的错误。正如在注解中所说的那样,您缺少的部分是,当您的
if (aTest == true)
无效时,您的代码的其余部分不会返回任何内容。您可以保留上面的代码,但只需包含以下内容:型
xytpbqjk3#
请记住,你在C#中写的东西不一定是编译出来的,
yield
关键字是一种“语法糖”,它不会导致你写的东西。尝试使用.Net反编译器(例如JustCode或dotPeek)打开编译后的代码,并检查IL(中间语言)结果。您将看到编译后的内容并非您所期望的。
简而言之,
yield return
只是“创建一个变量,填充它,然后返回它”的快捷方式。你可以在这里看到更多的解释:http://www.dotnetperls.com/yield
t9eec4r04#
考虑一下在以下情况下,如果aTestList为空会发生什么:
字符串
你知道会发生什么吗?枚举器不会产生任何结果。这正是你的问题中的代码所发生的。