foreach
se construye en la parte superior de IEnumerable<T>
El contrato para el empadronador en MSDN dice
Inicialmente, el enumerador se coloca antes de que el primer elemento de la colección. ... Por lo tanto, debe llamar a MoveNext para avanzar al enumerador al primer elemento de la colección antes de leer el valor de Actual.
Current devuelve el mismo objeto hasta que se llame a MoveNext. MoveNext establece Current para el siguiente elemento.
lo tanto, si la colección subyacente tiene claro elemento 'primero', y cada elemento tiene un claro elemento 'siguiente', como es el caso de matrices, listas y así sucesivamente, entonces se puede esperar que el foreach
se comporte Lógicamente y establemente Si es algo así como un conjunto, que no tiene una secuencia primera o siguiente, entonces puede comportarse de una manera inestable, aunque presumiblemente sin cambiar el estado de IEnumerable, incluso las colecciones que no tienen un orden definido serán consistentes, ya que hacerlas inconsistentes sería más ¡trabajo!