ok. the point is that structs get boxed if being casted to an
interface, so the only way to benefit from a struct enumerator is to
make it public (please note PUBLIC struct MyEnumerator):
internal class Program
{
private static void Main()
{
Stopwatch s = new Stopwatch();
s.Start();
MyEnumerable<int> mylist = new MyEnumerable<int>(); foreach
(int i in mylist) { int a = i; }
s.Stop();
Console.WriteLine("Struct iterator : " +
s.ElapsedMilliseconds + "ms");
s.Reset();
s.Start();
MyEnumerableClass<int> mylist2 = new MyEnumerableClass<int>();
foreach (int i in mylist2) { int a = i; }
s.Stop();
Console.WriteLine("Class iterator : " +
s.ElapsedMilliseconds + "ms");
}
}
class MyEnumerable<T> : IEnumerable<T>
{
public MyEnumerator GetEnumerator() { return new MyEnumerator(); }
IEnumerator<T> IEnumerable<T>.GetEnumerator() { return
GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return
GetEnumerator(); }
public struct MyEnumerator : IEnumerator<T>
{
private static int count = 10000000;
object IEnumerator.Current { get { return Current; } }
public void Dispose() { }
public bool MoveNext() { return (count-- > 0); }
public void Reset() { }
public T Current { get { return default(T); } }
}
}
class MyEnumerableClass<T> : IEnumerable<T>
{
public MyEnumeratorClass GetEnumerator() { return new
MyEnumeratorClass(); }
IEnumerator<T> IEnumerable<T>.GetEnumerator() { return
GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return
GetEnumerator(); }
public class MyEnumeratorClass : IEnumerator<T>
{
private static int count = 10000000;
object IEnumerator.Current { get { return Current; } }
public void Dispose() { }
public bool MoveNext() { return (count-- > 0); }
public void Reset() { }
public T Current { get { return default(T); } }
}
}
So, I presume since yield return generates a class, it could be an
issue exposing an autogenerated class/struct, so they left it private
AND class, since being a private struct does not add any value.
That's what I think.