什么时候迭代器 return 应该是 IEnumerator 而不是 IEnumerable?
When should an iterator return an IEnumerator instead of an IEnumerable?
使用yield return
将方法变成迭代器。 The return type of an iterator must be IEnumerable
, IEnumerable<T>
, IEnumerator
, or IEnumerator<T>
.
我发现如果迭代器 return 是 IEnumerable
类型之一,它只能在 foreach
循环中使用。鉴于此限制,什么时候选择 IEnumerator
return 类型而不是 IEnumerable
才有意义?
老实说,很少见。我唯一一次看到它以这种方式使用的时候是出于某种原因 在 GetEnumerator()
方法 中(在启动迭代器块机制之前),但仍然想要一个用于实际实现的迭代器块,即
public IEnumerator<T> GetEnumerator()
{
if (someScenario) return SomethingSpecialPerhapsEmptyArrayEnumerator();
if (anotherScenario) ThrowSomeException();
return DoTheThing();
}
private IEnumerator<T> DoTheThing()
{
// ... yield return
}
使用yield return
将方法变成迭代器。 The return type of an iterator must be IEnumerable
, IEnumerable<T>
, IEnumerator
, or IEnumerator<T>
.
我发现如果迭代器 return 是 IEnumerable
类型之一,它只能在 foreach
循环中使用。鉴于此限制,什么时候选择 IEnumerator
return 类型而不是 IEnumerable
才有意义?
老实说,很少见。我唯一一次看到它以这种方式使用的时候是出于某种原因 在 GetEnumerator()
方法 中(在启动迭代器块机制之前),但仍然想要一个用于实际实现的迭代器块,即
public IEnumerator<T> GetEnumerator()
{
if (someScenario) return SomethingSpecialPerhapsEmptyArrayEnumerator();
if (anotherScenario) ThrowSomeException();
return DoTheThing();
}
private IEnumerator<T> DoTheThing()
{
// ... yield return
}