IEnumerable proporciona dos métodos GetEnumerator - ¿cuál es la diferencia entre ellos?

StackOverflow https://stackoverflow.com/questions/560678

  •  05-09-2019
  •  | 
  •  

Pregunta

Cuando emplement interfaz IEnumerable<T> Veo dos métodos GetEnumerator: uno IEnumerator regresar y otra IEnumerator<T>. Cuándo se debe utilizar uno u otro?

¿Fue útil?

Solución

Si está implementando la interfaz genérica IEnumerable<T>, que será más o menos siempre tiene que utilizar el método GetEnumerator genérica -. A menos de emitir su objeto explícitamente (no genérico) IEnumerable

La razón es compatibilidad hacia atrás con .NET 1.0 / 1.1 que no apoyó los genéricos.

Otros consejos

Por lo general, implementar ambos. Una de ellas es la versión más reciente, genérica que devuelve un empadronador typesafe (IEnumerator<T>). El otro es para la compatibilidad con código Legacy (rendimientos IEnumerator). Una aplicación típica es:

public IEnumerator<T> GetEnumerator() {
    foreach(T item in items) {
        yield return item;
    }
}

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}

La razón hay dos métodos se debe a IEnumerable<T> hereda la interfaz IEnumerable por lo que está viendo el método genérico de IEnumerable<T> y el método no genérico de IEnumerable.

Aquí es cómo desea implementar la interfaz en su tipo:

class Foo : IEnumerable<Foo>
{
    public IEnumerator<Foo> GetEnumerator()   
    {
        // do your thing here
    }

    // do a EIMI here and simply call the generic method
    IEnumerator IEnumerable.GetEnumerator()
    {
        this.GetEnumerator();
    }
}

Por lo general, las llamadas GetEnumerator() GetEnumerator<T>(), así que no debería haber mucha diferencia en el comportamiento. En cuanto a por qué hay dos métodos, esto se hace por razones de compatibilidad y para su uso en la situación en la que T no es de gran interés (o es desconocido).

El uno es genérico, el otro no uno. Creo que el compilador prefiere utilizar la sobrecarga genérica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top