为什么使用yield return 的这段代码可以编译?

正如您所料,此代码会产生编译器错误:


public static IEnumerable<int> Foo()

{

}

并非所有代码路径都会返回值


但是,编译时仅显示有关无法访问代码的警告:


public static IEnumerable<int> Foo()

{

    if(false)

    {

        yield return 0;

    }

}

这会产生一个空的枚举。为什么这会起作用?它是定义的行为吗?


江户川乱折腾
浏览 67回答 1
1回答

慕运维8079593

public static IEnumerable<int> Foo(){}第一个没有返回(因此是编译器消息)。这是有道理的——它没有足够的上下文来知道该怎么做。应该返回null吗?空枚举?它不知道 - 所以它不会让你编译。public static IEnumerable<int> Foo(){&nbsp; &nbsp; if(false)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; yield return 0;&nbsp; &nbsp; }}第二个确实有一个yield return(即使无法访问),这给了它足够的上下文来知道您想要返回一个可枚举的(因此它可以设置必要的状态机)。现在,当代码执行时,您实际上从未命中该yield return行(因此编译器警告) - 因此调用者将得到一个空的可枚举值。这是预期的——如果没有产量中断,编译器会在函数末尾假设有一个产量中断(就像普通函数中的 return; 语句一样)考虑到第二个代码示例是多么丑陋和不直观,您可能希望改用:public static IEnumerable<int> Foo(){&nbsp; &nbsp; yield break;}由于它可以编译,因此其意图更加清晰,并且编译器不会抱怨无法访问的代码
打开App,查看更多内容
随时随地看视频慕课网APP