Как в C# работает цикл foreach?

Мне стало интересно, как работает данный цикл именно с технической стороны, ведь ему можно передавать как массивы, коллекции, так и словари. Хочу создать свой собственный класс и сделать его совместимым с циклом foreach.

Для того, что бы созданный Вами класс был совместим с циклом foreach, он должен реализовать два интерфейса: IEnumerable, IEnumerator. Причём необязательно, что бы было указание, что он наследуется от них - достаточно реализации методов с теми же объявлениями.
Сам же цикл foreach работает следующим образом:

ArrayList сoll = new ArrayList();
сoll.Add(1);
сoll.Add("21e31");
сoll.Add(3);
сoll.Add(2);
IEnumerator enumerator = (сoll as IEnumerable).GetEnumerator();

while (enumerator.MoveNext())
{
Console.WriteLine( enumerator.Current.ToString());
}

если класс будет также реализовать интерфейс IDisposable, то после выполнения цикла while произойдёт вызов его метода Dispose

члены интерфейса IEnumerable:

  • IEnumerator GetEnumerator();

члены интерфейса IEnumerator:

  • object Current { get; }
  • bool MoveNext();
  • void Reset();

члены интерфейса IDisposable:

  • void Dispose();

Александр Шевчук в своём видеоуроке достаточно подробно это рассматривает.

Спасибо!