Problemas al implementar IEnumerable

Intento escribir mi propia implementación (simple) de List. Esto es lo que hice hasta ahora:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace provaIEnum { class MyList : IEnumerable { private T[] _array; public int Count { get; private set; } public MyList() { /* ... */ } public void Add(T element) { /* ... */ } // ... public IEnumerator GetEnumerator() { for (int i = 0; i < Count; i++) yield return _array[i]; } } 

Me aparece un error sobre GetEnumerator:

‘provaIEnum.Lista’ no implementa el miembro de interfaz ‘System.Collections.IEnumerable.GetEnumerator ()’. ‘provaIEnum.Lista.GetEnumerator ()’ no puede implementar ‘System.Collections.IEnumerable.GetEnumerator ()’ porque no tiene el tipo de retorno coincidente de ‘System.Collections.IEnumerator’.

No estoy seguro si entiendo lo que VS está tratando de decirme y no tengo ni idea de cómo solucionarlo.

Gracias por tu tiempo

Como IEnumerable implementa IEnumerable , necesita implementar esta interfaz también en su clase, que tiene la versión no genérica del método GetEnumerator . Para evitar conflictos, puede implementarlo explícitamente:

 IEnumerator IEnumerable.GetEnumerator() { // call the generic version of the method return this.GetEnumerator(); } public IEnumerator GetEnumerator() { for (int i = 0; i < Count; i++) yield return _array[i]; } 

Lea el mensaje de error con más cuidado; te está diciendo exactamente lo que debes hacer. No implementó System.Collections.IEnumerable.GetEnumerator .

Cuando implemente el IEnumerable genérico, también debe implementar GetEnumerator de System.Collections.IEnumerable .

La forma estándar de hacerlo es:

 public IEnumerator GetEnumerator () { whatever } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } 

También deberá implementar el método GetEnumerator no genérico:

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

Como la IEnumerable extiende IEnumerable , debe implementar los métodos declarados en ambos.

Agregue el siguiente método:

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

Hay dos sobrecargas de GetEnumerator() que debe implementar. Uno viene de IEnumerable y devuelve IEnumerator . El otro viene de IEnumerable y devuelve IEnumerator . La anulación debería verse así:

IEnumerator IEnumerable.GetEnumerator()

Esto se debe a que IEnumerable implementa IEnumerable .

Desde su clase, MyList hereda IEnumerable que a su vez hereda el IEnumerable no genérico, tiene dos métodos que debe implementar:

 IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { throw new NotImplementedException(); } 

Una forma fácil de hacerlo es cuando declaras tu clase:

 class MyList : IEnumerable 

Haga clic con el botón derecho en el texto IEnumerable y seleccione Implement Interface> Implement Interface Explictly en el menú contextual.

Tengo un problema similar, aunque también implementé IEnumerable e IEnumerable. Estaba usando un tipo personalizado (clase Person) que el tipo genérico T. Para mí, la razón era que el espacio de nombres no estaba incluido en la parte superior del archivo.

 using System.Collections; 

Después de agregar el espacio de nombres, estaba bien para mí.