== 続き ==
で、この非ジェネリック版のGetEnumerator()はどんなときに呼ばれるんだろう?と思い、試しに無理やり
呼んでみようと、下のように非ジェネリックなIEnumerator iを経由してMoveNext()をコールしてみました。
しかし、デバッガで見る限り、ジェネリック版のほうのGetEnumerator()が呼ばれるようです。

MyCollection<int> collection = new MyCollection<int>();
collection.AddObject(0);
collection.AddObject(1);
collection.AddObject(2);
//IEnumerator<int> i = collection.GetEnumerator();
IEnumerator i = collection.GetEnumerator();
while (i.MoveNext())
{ var j = i.Current; Console.WriteLine(j); }

ここで質問なのですが、
(1) 上記のコードで、どうして非ジェネリック版のGetEnumerator()が呼ばれないのか?
(2) どんなときに呼ばれるのか?
(3) 上記のコードでは、非ジェネリック版のGetEnumerator()の中からジェネリック版のGetEnumerator()を
呼んでいるが、両者は戻り値が異なる(IEnumerator<T>とIEnumerator)のに、なぜそんなことができるのか?

以上、よろしくお願いします。