IEnumerable proporciona dos métodos GetEnumerator - ¿cuál es la diferencia entre ellos?
-
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?
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.