Apparently, the types are not required to implement IEnumerable to be iterated over with foreach loop – they just required to have GetEnumerator() method.
class EnumerableItem { } class EnumerableItemsCollection // : IEnumerable<EnumerableItem> { public IEnumerator<EnumerableItem> GetEnumerator() { return null; } public static void Test() { foreach (var item in new EnumerableItemsCollection()) { } } }
The code above compiles just fine.
My first thought was – “Reflection ?”. Can’t be, Reflection is too slow. It is, in fact, handled by compiler.
First, it checks if the type can be implicitly converted to an IEnumerable; if it can’t – it will look for a GetEnumerator method.
Also, the foreach loop calls for Dispose on enumerated object, so using using on it is redundant.
Btw, for some reason foreach loop seems to be a bit faster than for loop (not by much, and they’re both very fast.. don’t switch for loops to foreach to speed up your code :)).
For references, check the C# language specs document.