为什么此代码:
public IEnumerator Test()
{
}
给您一个错误:
错误CS0161'test.getEnumerator()':并非所有代码路径返回值
但是,此代码:
public IEnumerator Test()
{
if(false)
yield return 0;
}
不?(并按预期工作;第一个movenext()返回false)
在使用ienumerators用作Coroutines时,有时您想制作一个尚未有异步操作的Coroutine(Ienumerator)(尚未产生任何东西),但将来可能会做到这一点。
来自C#规范:
一个包含一个或多个收益率语句(§8.14)的块被调用 迭代器块。迭代器块用于实现功能 成员作为迭代器(§10.14)。
因此,如果您有一个或多个收益率语句,无论是否可以到达,您的方法都是迭代器(在引擎盖下会生成迭代器类)。但是,如果您没有任何收益率语句,您的方法是序数方法(不是迭代器),该方法的返回值为IEnumerable
类型。作为返回一定值的任何其他方法,您必须返回所需类型的值或从方法主体中抛出异常。当您拥有返回string
或int
值的方法时,也会应用相同的规则。
如果方法块中没有任何yield
语句上面的相关转换。它将像您返回值的其他方法一样对待它。
编译器团队可以完成他们对async
的工作,并在该方法的签名中添加了一个新的关键字,如果存在,该方法使该方法成为迭代器块,允许在该方法中使用yield
语句。身体,会让一个空的身体被视为什么都不屈服,但他们选择不屈服。
如果方法主体中的某个地方有一个yield
语句,则实际上并不需要可靠地击中该方法正确编译和运行的方法。在迭代器块中击中方法的末端意味着序列已经结束,即使尚未产生任何项目,这是一个完全明智的行为。该方法仍然具有IEnumerable
或IEnumerator
的返回,它只是没有值的值。