using System.Collections.Generic;
public interface IGenerator<out T> : IEnumerator<T>, IEnumerable<T>
public class EnumerableWrapper<T> : IGenerator<T>
private IEnumerable<T> wrapped;
private IEnumerator<T> enumerator;
public EnumerableWrapper(IEnumerable<T> wrapped) {
this.enumerator = wrapped.GetEnumerator();
IEnumerator<T> GetEnumerator() { return this; }
return enumerator.Current;
override public bool MoveNext() {
return enumerator.MoveNext();
override public void Reset() {
override public void Dispose() {
static IEnumerable<int> F()
Console.WriteLine(" F 0");
Console.WriteLine(" F 1");
Console.WriteLine(" F 2");
static IGenerator<int> FWrapped() {
return new EnumerableWrapper<int>(F());
static int? GetNext(IEnumerable<int> e) {
var en = e as IEnumerator<int>;
static int? GetNext(IEnumerator<int> e) {
public static void Main()
var e = F().GetEnumerator();
Console.WriteLine($" Got {i}");
if (i == null) { break; }
Console.WriteLine(" ForIn");
Console.WriteLine($" Got {i}");
if (i == null) { break; }
Console.WriteLine(" ForIn");
var i = GetNext(e as IEnumerator<int>);
Console.WriteLine($" Got {i}");
if (i == null) { break; }
Console.WriteLine(" ForIn");
foreach (int i in FWrapped()) {