2010-06-05 14 views
8

Ricevo questo messaggio di errore e non riesco a capire perché!Messaggio di errore relativo 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 

Ecco il codice con un'implementazione di GetEnumerator(). Cosa c'è che non va?

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

Semplicemente non lanciare l'oggetto innerCollection, sia per le implementazioni IEnumerable che IEnumerable . Vedere il mio codice completo nella risposta postata qui sotto ... – code4life

+1

Ho notato che il messaggio di errore ti dice esattamente * cosa sta andando storto qui: che IEnumerable non è stato implementato, che è necessario che sia implementato e che l'unico metodo che potrebbe implementarlo ha il tipo di ritorno sbagliato. Ciò ha già richiesto un'analisi degli errori piuttosto sofisticata e tuttavia non è stato sufficiente per consentire di diagnosticare il problema da solo. Un altro messaggio di errore sarebbe stato più utile? Quale tipo di messaggio di errore ti avrebbe permesso di diagnosticare il problema senza chiedere aiuto? –

+0

Sono un principiante e sto leggendo il libro di Visual C# Wrox (per principianti). Non sapevo che avrei dovuto implementare sia IEnumerable che IEnumerable , in quanto non è nemmeno menzionato nel libro. Inoltre, quel codice era la risposta dell'esercizio (chiedendosi se hanno controllato il codice prima di stamparlo). Ho dato un'occhiata al sito Web di msdn e al forum di wrox, ma non lo menzionano neanche. Devo dire che IEnumerable è abbastanza difficile per me da imparare. Ma ora che leggo di nuovo l'errore sono d'accordo che abbia senso. –

risposta

4

IEnumerable e IEnumerable<T> sono diverse interfacce e il codice deve implementare sia. Il codice implementa solo GetEnumerator() di IEnumerable<T>, ma non GetEnumerator() di IEnumerable. Dovresti prendere in considerazione l'installazione di ReSharper che facilita la correzione di errori come questo.

+0

+1 per Resharper (R #) ... è davvero sorprendente. –

+0

Joel, grazie per la modifica. Dove trovo la documentazione delle opzioni di formattazione? – Achim

+0

punto interrogativo arancione sopra la textarea. – wRAR

3

è necessario implementare un paio di cose:

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 
} 

Questo codice verrà compilato ... :)

+0

Grazie mille! –

12

Come altri hanno detto, è necessario implementare IEnumerable così come IEnumerable<T>. Tuttavia, dal momento che si IEnumberable<T> implemets IEnumerable questo è banale, basta chiamare il vostro generico 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(); 
    } 
} 

sto supponendo che si dispone di metodi per la realtà aggiunta e la rimozione dalla innerCollection e proprio loro hanno lasciato fuori per brevità dal didn si riferiscono alla domanda in questione.

+0

Grazie mille! Sì, ho lasciato il resto. Grazie ancora! –

+0

Questa è una risposta molto migliore rispetto a quella selezionata come corretta, in quanto contiene un esempio di codice. @Bon_chan considera di cambiare la tua selezione. –

+0

Ho trascorso una quantità imbarazzante di tempo cercando di risolvere questo problema. +1 per 'IEnumerator IEnumerable.GetEnumerator()'. –

Problemi correlati