为什么 IEnumerator 必须至少有一个 yield 语句,即使它无法访问?



为什么此代码:

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类型。作为返回一定值的任何其他方法,您必须返回所需类型的值或从方法主体中抛出异常。当您拥有返回stringint值的方法时,也会应用相同的规则。

如果方法块中没有任何yield语句上面的相关转换。它将像您返回值的其他方法一样对待它。

编译器团队可以完成他们对async的工作,并在该方法的签名中添加了一个新的关键字,如果存在,该方法使该方法成为迭代器块,允许在该方法中使用yield语句。身体,会让一个空的身体被视为什么都不屈服,但他们选择不屈服。

如果方法主体中的某个地方有一个yield语句,则实际上并不需要可靠地击中该方法正确编译和运行的方法。在迭代器块中击中方法的末端意味着序列已经结束,即使尚未产生任何项目,这是一个完全明智的行为。该方法仍然具有IEnumerableIEnumerator的返回,它只是没有值的值。

最新更新