Не буду умничать, что foreach это синтаксический сахар над while и IEnumerable / IEnumerator, и как минимум нет проверки условий, вы просто ловите эксепшн, когда нет следущего элемента )) В общем обычно в таких вопросах рекомендуется смотреть в генерируемый IL, тогда будет все понятно