Вы не можете этого сделать, потому что вы сделали свой код единым перечислителем, что само по себе является ошибкой IMO.Лучшая версия была бы для меня:
class T : IEnumerable<int> {
public IEnumerator<int> GetEnumerator() {
int i = 0;
while(i < 5) {
yield return i;
i++;
}
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
Компилятор создаст правильные устройства для достижения этого с отдельными перечислителями.
Если вы не пишете для .NET 1.1, то если вынайди себя вручную при написании энумаратора, есть очень хороший шанс, что ты сделаешь это нелегко и ошибочно получишь бонус.
Если ты действительно должен сделать это нелегко:
class T : IEnumerable<int>
{
public T() { }
public IEnumerator<int> GetEnumerator() { return new TEnumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
private class TEnumerator : IEnumerator<int>
{
private int position = -1;
public int Current { get { return position; } }
object IEnumerator.Current { get { return Current; } }
void IDisposable.Dispose() {}
public bool MoveNext()
{
position++;
return (position < 5);
}
public void Reset() { position = -1; }
}
}
Здесь важно, что различные экземпляры TEnumerator
позволяют один и тот же экземпляр T
повторяться отдельно.