【问题标题】:When should an iterator return an IEnumerator instead of an IEnumerable?迭代器何时应返回 IEnumerator 而不是 IEnumerable?
【发布时间】:2020-07-28 10:14:43
【问题描述】:

使用yield return 将方法转换为迭代器。 The return type of an iterator must be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

我发现,如果迭代器返回 IEnumerable 类型之一,则它只能在 foreach 循环中使用。鉴于此限制,何时选择 IEnumerator 返回类型而不是 IEnumerable 有意义?

【问题讨论】:

  • 我见过的唯一一个返回 IEnumerator 的迭代器方法是用于 Unity's coroutines。我认为这是因为他们(ab)使用迭代器机制来做一些不同的事情,并且不希望人们意外地认为他们应该循环协程。
  • 我真的认为这段代码:dotnetfiddle.net/KOMtuL - 会崩溃,因为我只返回接口IEnumerator 所以谁真的实现了MoveNext() 方法?!?魔法?
  • @RandRandom Demystified
  • @RandRandom 代码块将被编译成一个 IEnumerator 状态机,该状态机将处理 MoveNext 和 Current。

标签: c# iterator ienumerable ienumerator


【解决方案1】:

说实话,很少见。我唯一见过它以这种方式使用的情况是,出于某种原因GetEnumerator()方法中(在启动迭代器块机器之前),但仍然想要一个迭代器块实际的实现,即

public IEnumerator<T> GetEnumerator()
{
    if (someScenario) return SomethingSpecialPerhapsEmptyArrayEnumerator();
    if (anotherScenario) ThrowSomeException();
    return DoTheThing();
}
private IEnumerator<T> DoTheThing()
{
    // ... yield return
}

【讨论】:

  • 所以如果迭代器返回IEnumerable,则自动生成GetEnumerator,但如果它返回IEnumerator,则不会自动生成?这两种返回类型之间还有其他区别吗?
  • @user200783 主要是这样
猜你喜欢
  • 2012-06-16
  • 2010-09-29
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2020-02-17
  • 2018-06-15
相关资源
最近更新 更多