2011-01-14 12 views
6

suponer Básicamente tienes alguna colección:¿Está bien que devuelva IEnumerator <T>. GetEnumerator() en IEnumerator.GetEnumerator()?

public class FurCollection : IEnumerable<FurStrand> 
{ 
    public IEnumerator<FurStrand> GetEnumerator() 
    { 
     foreach(var strand in this.Strands) 
     { 
     yield return strand; 
     } 
    } 

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

Es esto aceptable? ¿O es esta propensión a errores o mala práctica? Casi siempre usaré el IEnumerator<T> pero aún quiero que la versión no genérica sea estable y se implemente correctamente.

+0

Estoy seguro quieres decir ** IEnumerable ** en lugar de ** IEnumerator ** ... –

+0

Gracias, lo siento, escribí esta muestra rápidamente. –

Respuesta

10

Esto es completamente estándar y se recomienda para cumplir con DRY y otras preocupaciones.

Tenga en cuenta que

return strand; 

debería ser

yield return strand; 

Además, parece que this.Strands ya implementa IEnumerable<FurStrand> por lo que podría simplemente decir

return this.Strands.GetEnumerator(); 
+1

Acepto, buena práctica –

+0

Gracias, lamento, acabo de hacer esta muestra, así que olvidé el rendimiento. –

+0

@Downvoter: realmente necesitas explicarte. – jason

5

No, esto es perfectamente aceptable. Recomendado incluso

4

Esto no sólo es una buena práctica, pero su proyecto no cumplirá sin esto, porque IEnumerable<T> hereda IEnumerable. Mira la definición de IEnumerable<T>:

public interface IEnumerable<out T> : IEnumerable 
    IEnumerator<T> GetEnumerator(); 
} 

Hay que aplicar la versión no genérica o que obtendrá un error "... no implementa miembro de interfaz ..."

+0

Has entendido mal la pregunta. – jason

+0

Oh, ¿cuál es la alternativa? –

+0

No importa, lo entiendo. Creo que aprendí a hacerlo de esa manera con los genéricos, nunca se me ocurrió NO devolver el mismo enumerador. –

Cuestiones relacionadas