C# 迭代器何时应该返回IEnumerator而不是IEnumerable?

C# 迭代器何时应该返回IEnumerator而不是IEnumerable?,c#,iterator,ienumerable,ienumerator,C#,Iterator,Ienumerable,Ienumerator,使用yield return将方法转换为迭代器 我发现迭代器只能在foreach循环中使用,如果它返回IEnumerable类型之一。考虑到这个限制,什么时候选择一个IEnumerator返回类型而不是IEnumerable?是有意义的,老实说。我见过的唯一一次使用这种方法是,在GetEnumerator()方法中(在启动迭代器块机制之前)出于某种原因对事物进行特殊的大小写,但仍然需要实际实现的迭代器块,即 public IEnumerator GetEnumerator() { if(some

使用
yield return
将方法转换为迭代器


我发现迭代器只能在
foreach
循环中使用,如果它返回
IEnumerable
类型之一。考虑到这个限制,什么时候选择一个
IEnumerator
返回类型而不是
IEnumerable

是有意义的,老实说。我见过的唯一一次使用这种方法是,在
GetEnumerator()
方法中(在启动迭代器块机制之前)出于某种原因对事物进行特殊的大小写,但仍然需要实际实现的迭代器块,即

public IEnumerator GetEnumerator()
{
if(someScenario)返回someThingSpecialPerhapsEmptyArray枚举器();
如果(另一个场景)通过OmeException();
返回DoTheThing();
}
私有IEnumerator DoTheThing()
{
//…收益率
}

我见过的唯一一个迭代器方法返回
IEnumerator
的地方是for。我认为这是因为他们(ab)使用迭代器机制来做一些不同的事情,不希望人们意外地认为他们应该在协同程序上循环。我真的认为这个代码:-会崩溃,因为我只返回接口
IEnumerator
,那么谁真正实现了这个方法
MoveNext()
?!?Magic?@RandRandom@RandRandRandom代码块将被编译成一个IEnumerator状态机,该状态机将处理MoveNext和Current。因此,如果迭代器返回
IEnumerable
,则会自动生成
GetEnumerator
,如果迭代器返回
IEnumerator
,则不会自动生成?这两种返回类型之间还有其他区别吗?@user200783主要是这样