2009-02-18 10 views

Respuesta

8

Si implementa la interfaz genérica IEnumerable<T>, tendrá más o menos siempre tiene que utilizar el método GetEnumerator genérico - a menos que emite su objeto explícitamente (no genérico) IEnumerable.

El motivo es la compatibilidad con .NET 1.0/1.1 al revés, que no admitía los genéricos.

2

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

4

Normalmente GetEnumerator() llama a GetEnumerator<T>(), por lo que no debería haber mucha diferencia en el comportamiento. En cuanto a por qué hay dos métodos, esto se hace por compatibilidad con versiones anteriores y para su uso en situaciones donde T no es de gran interés (o simplemente es desconocido).

9

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(); 
    } 
} 
+0

+1 - EIMI = Implementación explícita del miembro de la interfaz –

+0

Pero, ¿cómo demonios 'Foo: IEnumerable ' tiene sentido? – nawfal

30

Por lo general, implementar ambos. Una es la versión más nueva y genérica que devuelve un enumerador seguro (IEnumerator<T>). El otro es por compatibilidad con el código heredado (devuelve IEnumerator). Una aplicación típica es:

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

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

¡esta me ayudó mucho, evitando la clase extra para el enumerador anidado! –

+0

+1. También busqué en Google para encontrar una implementación de referencia que evita la clase de enumerador anidado y esta fue la primera respuesta que encontré. –

Cuestiones relacionadas