2012-07-03 17 views
10

Me gustaría que mi tipo implemente IEnumerable<string>. He intentado seguir C# en una cáscara de nuez, pero algo salió mal:Cómo implementar IEnumerable <T> con GetEnumerator()?

public class Simulation : IEnumerable<string> 
{ 
    private IEnumerable<string> Events() 
    { 
     yield return "a"; 
     yield return "b"; 
    } 

    public IEnumerator<string> GetEnumerator() 
    { 
     return Events().GetEnumerator(); 
    } 
} 

Pero consigo el error de generación

de error 1 'EventSimulator.Simulation' no implementa miembro de interfaz System.Collections'. IEnumerable.GetEnumerator() '. 'EventSimulator.Simulation.GetEnumerator()' no puede implementar 'System.Collections.IEnumerable.GetEnumerator()' porque no tiene el tipo de retorno coincidente de 'System.Collections.IEnumerator'.

+0

Aparte: puede 'yield return' directamente desde dentro' GetEnumerator() ' – AlexFoxGill

Respuesta

25

Te estás perdiendo IEnumerator IEnumerable.GetEnumerator():

public class Simulation : IEnumerable<string> 
{ 
    private IEnumerable<string> Events() 
    { 
     yield return "a"; 
     yield return "b"; 
    } 

    public IEnumerator<string> GetEnumerator() 
    { 
     return Events().GetEnumerator(); 
    } 

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

Gracias esto funcionó. –

+0

Tenía una pregunta, pero @NominSim respondió en la publicación a continuación - ¡no importa! –

+0

gracias, ahora puedo agregar esto a mi archivo EF TT ;-) –

4

IEnumerable requiere que implemente tanto la escrita a máquina y método genérico.

En la sección de comunidad de msdn docs, explica por qué necesita ambos. (Por razones de compatibilidad hacia atrás es la razón dada esencialmente).

Cuestiones relacionadas