正如您所料,此代码会产生编译器错误:public static IEnumerable<int> Foo(){}并非所有代码路径都会返回值但是,编译时仅显示有关无法访问代码的警告:public static IEnumerable<int> Foo(){ if(false) { yield return 0; }}这会产生一个空的枚举。为什么这会起作用?它是定义的行为吗?
1 回答
慕运维8079593
TA贡献1876条经验 获得超5个赞
public static IEnumerable<int> Foo()
{
}
第一个没有返回(因此是编译器消息)。这是有道理的——它没有足够的上下文来知道该怎么做。应该返回null吗?空枚举?它不知道 - 所以它不会让你编译。
public static IEnumerable<int> Foo()
{
if(false)
{
yield return 0;
}
}
第二个确实有一个yield return(即使无法访问),这给了它足够的上下文来知道您想要返回一个可枚举的(因此它可以设置必要的状态机)。现在,当代码执行时,您实际上从未命中该yield return行(因此编译器警告) - 因此调用者将得到一个空的可枚举值。这是预期的——
如果没有产量中断,编译器会在函数末尾假设有一个产量中断(就像普通函数中的 return; 语句一样)
考虑到第二个代码示例是多么丑陋和不直观,您可能希望改用:
public static IEnumerable<int> Foo()
{
yield break;
}
由于它可以编译,因此其意图更加清晰,并且编译器不会抱怨无法访问的代码
- 1 回答
- 0 关注
- 80 浏览
添加回答
举报
0/150
提交
取消