2010-06-05 21 views
8

Aparece este mensaje de error y no puedo entender por qué.Mensaje de error con respecto a IEnumerable.GetEnumerator()

Error 1 'Exo5Chap12.ShortCollection<T>' does not implement interface member 
'System.Collections.IEnumerable.GetEnumerator()'. 
'Exo5Chap12.ShortCollection<T>.GetEnumerator()' cannot implement 
'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching 
return type of 'System.Collections.IEnumerator'.  
E:\MyFolders\Dev\c#\Chapter12\Exo5Chap12\Exo5Chap12\exo5.cs 9 18 Exo5Chap12 

Aquí está el código con una implementación de GetEnumerator(). ¿Qué pasa?

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 
    public IEnumerator<T> GetEnumerator() 
    { 
     return (innerCollection as IEnumerator<T>).GetEnumerator(); 
    } 
} 
+0

Simplemente no copie el objeto innerCollection, para las implementaciones IEnumerable e IEnumerable . Vea mi código completo en la respuesta publicada a continuación ... – code4life

+1

Noté que el mensaje de error le dice * exactamente * qué está pasando mal aquí: que IEnumerable no se ha implementado, que se debe implementar y que el único método que podría implementarlo tiene el tipo de devolución incorrecto. Eso ya requirió un análisis de error bastante sofisticado y, sin embargo, no fue suficiente para permitirle diagnosticar el problema por su cuenta. ¿Hubiera sido más útil un mensaje de error diferente? ¿Qué tipo de mensaje de error le habría permitido diagnosticar el problema sin pedir ayuda? –

+0

Soy un novato y estoy leyendo el libro de Wrox (principiante) de Visual C#. No sabía que tenía que implementar tanto IEnumerable como IEnumerable , ya que ni siquiera se menciona en el libro. Además, ese código fue la respuesta del ejercicio (preguntándose si revisaron el código antes de imprimirlo). Eché un vistazo al sitio web de msdn y al foro de wrox, pero tampoco lo mencionan. Debo decir que IEnumerable es bastante difícil de aprender. Pero ahora que leí el error nuevamente, estoy de acuerdo, tiene sentido. –

Respuesta

4

IEnumerable y IEnumerable<T> son diferentes interfaces y su código tiene que aplicar ambos. Su código solo implementa el GetEnumerator() de IEnumerable<T>, pero no GetEnumerator() de IEnumerable. Debería considerar la instalación de ReSharper, que facilita la corrección de errores como este.

+0

+1 por Resharper (R #) ... es bastante sorprendente. –

+0

Joel, gracias por la edición. ¿Dónde encuentro la documentación de las opciones de formato? – Achim

+0

naranja signo de interrogación sobre el área de texto. – wRAR

3

es necesario implementar algunas cosas más:

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 

    #region IList<T> Members 

    public int IndexOf(T item) 
    { 
     return innerCollection.IndexOf(item); 
    } 

    public void Insert(int index, T item) 
    { 
     innerCollection.Insert(index, item); 
    } 

    public void RemoveAt(int index) 
    { 
     innerCollection.RemoveAt(index); 
    } 

    public T this[int index] 
    { 
     get 
     { 
      return innerCollection[index]; 
     } 
     set 
     { 
      innerCollection[index] = value; 
     } 
    } 

    #endregion 

    #region ICollection<T> Members 

    public void Add(T item) 
    { 
     innerCollection.Add(item); 
    } 

    public void Clear() 
    { 
     innerCollection.Clear(); 
    } 

    public bool Contains(T item) 
    { 
     return innerCollection.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     innerCollection.CopyTo(array, arrayIndex); 
    } 

    public int Count 
    { 
     get { return innerCollection.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return false; } 
    } 

    public bool Remove(T item) 
    { 
     return innerCollection.Remove(item); 
    } 

    #endregion 

    #region IEnumerable<T> Members 

    public IEnumerator<T> GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    #endregion 

    #region IEnumerable Members 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    #endregion 
} 

Este código se compilará ... :)

+0

¡Muchas gracias! –

12

Como han dicho otros, es necesario implementar IEnumerable, así como IEnumerable<T>. Sin embargo, ya en sí IEnumberable<T> implemets IEnumerable esto es trivial, simplemente llame a su genérica GetEnumerator():

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 
    public IEnumerator<T> GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

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

Estoy asumiendo que usted tiene métodos para agregar y quitar realidad de la innerCollection y sólo les quedan fuera por razones de brevedad, ya que dejase No se relaciona con la pregunta que nos ocupa.

+0

¡Muchas gracias! Sí, dejé el resto afuera. ¡Gracias de nuevo! –

+0

Esta es una respuesta mucho mejor que la que se seleccionó como correcta, ya que contiene un ejemplo de código. @Bon_chan considere cambiar su selección. –

+0

Pasé una cantidad vergonzosa de tiempo tratando de resolver esto. +1 para 'IEnumerator IEnumerable.GetEnumerator()'. –

Cuestiones relacionadas