Tienes muy buenas respuestas aquí. Solo un poco de énfasis. Un enumerador mantiene el estado, realiza un seguimiento del objeto actual en la colección que se enumera. Disponible a través de IEnumerator.Current. Y sabe cómo cambiar ese estado, IEnumerator.MoveNext(). Mantener el estado requiere un objeto separado que almacene el estado. Ese estado no se puede almacenar dentro del objeto de colección fácilmente porque solo hay un objeto de colección, pero puede haber más de un enumerador.
Utilicé la frase "fácilmente" porque en realidad es posible que una colección realice un seguimiento de sus enumeradores. Después de todo, era una llamada al método GetEnumerator() de la clase de recopilación que devolvía el iterador. Hay una clase de colección en el marco .NET que hace esto, Microsoft.VisualBasic.Collection. Necesitaba implementar un contrato VB6 para su clase Collection y ese contrato especifica que el cambio de una colección mientras se está enumerando es legal. Lo que significa que cuando se modifique la Colección, debe ser razonable con todos los objetos del iterador que se crearon.
Se les ocurrió un truco muy bueno, WeakReference podría haberse inspirado en esto. Echa un vistazo al código mostrado por Reflector. Cosas inspiradoras Cave un poco más y encuentre "versión" en las clases de colección. Truco impresionante
1. Este es un buen ejemplo de por qué las interfaces son independientes y discretas. Otra razón es que la misma colección de tipos podría enumerarse de diferentes maneras. Imagine un árbol binario: puede realizar recorridos de prefijo, infijo, posfijo y ancho en primer lugar (solo por nombrar algunos). Mantener las interfaces separadas permite realizar diferentes tipos de recorridos en la misma estructura a través de una única interfaz simple. – LBushkin
¡Gracias por su respuesta! Esto es más claro para mí ahora. –