为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
江户川乱折腾 2023-07-09 15:01:36
正如您所料,此代码会产生编译器错误: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;

}

由于它可以编译,因此其意图更加清晰,并且编译器不会抱怨无法访问的代码


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信