2010-06-05 9 views
8

Ich bekomme diese Fehlermeldung und ich kann nicht herausfinden, warum!Fehlermeldung bezüglich 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 

Hier ist der Code mit einer Implementierung von GetEnumerator(). Was ist los?

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

Einfach nicht das InnerCollection-Objekt für die Implementierungen IEnumerable und IEnumerable . Siehe meinen vollständigen Code in der geposteten Antwort unten ... – code4life

+1

Ich merke, dass die Fehlermeldung Ihnen * genau * sagt, was hier schief geht: dass IEnumerable nicht implementiert wurde, dass es implementiert werden muss, und dass das die einzige Methode ist das könnte es implementieren, hat den falschen Rückgabetyp. Das hat schon eine ziemlich komplizierte Fehleranalyse erfordert und doch reicht es nicht aus, das Problem selbst zu diagnostizieren. Wäre eine andere Fehlermeldung hilfreicher gewesen? Welche Art von Fehlermeldung hätte es Ihnen ermöglicht, das Problem zu diagnostizieren, ohne nach Hilfe zu fragen? –

+0

Ich bin ein Neuling und lese das Wrox (Anfänger) Visual C# Buch. Ich wusste nicht, dass ich IEnumerable und IEnumerable implementieren musste, da es nicht einmal in dem Buch erwähnt wird. Außerdem war dieser Code die Antwort der Übung (frage mich, ob sie den Code vor dem Ausdruck überprüft hatten). Ich habe mir die msdn Webseite und das wrox Forum angesehen, aber sie erwähnen es auch nicht. Ich muss sagen IEnumerable ist ziemlich schwer für mich zu lernen. Aber jetzt, da ich den Fehler wieder lese, stimme ich zu, dass es Sinn macht. –

Antwort

4

IEnumerable und IEnumerable<T> sind verschiedene Schnittstellen und Code hat sowohl zu implementieren. Ihr Code implementiert nur die GetEnumerator() von IEnumerable<T>, aber nicht GetEnumerator() von IEnumerable. Sie sollten die Installation von ReSharper in Erwägung ziehen, um Fehler wie diese zu beheben.

+0

+1 für Resharper (R #) ... es ist ziemlich erstaunlich. –

+0

Joel, danke für den Schnitt. Wo finde ich die Dokumentation der Formatierungsoptionen? – Achim

+0

orange Fragezeichen über dem Textfeld. – wRAR

3

Sie müssen noch ein paar Dinge implementieren:

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 
} 

Dieser Code kompiliert ... :)

+0

Vielen Dank! –

12

Wie schon andere gesagt haben, müssen Sie IEnumerable sowie IEnumerable<T> implementieren. Da jedoch IEnumberable<T> selbst implemets IEnumerable diese trivial ist, rufen Sie einfach Ihre allgemeine 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(); 
    } 
} 

Ich gehe davon aus, dass Sie Methoden für die tatsächlich das Hinzufügen und Entfernen von der innerCollection haben und ließ sie nur aus Gründen der Kürze aus, da sie didn beziehen sich nicht auf die vorliegende Frage.

+0

Vielen Dank! Ja, ich habe den Rest vergessen. Danke noch einmal! –

+0

Dies ist eine viel bessere Antwort als die als richtig ausgewählte Antwort, da sie ein Codebeispiel enthält. @Bon_chan erwäge, deine Auswahl zu ändern. –

+0

Ich verbrachte eine peinliche Zeit damit, dieses Problem zu lösen. +1 für IEnumerator IEnumerable.GetEnumerator() '. –

Verwandte Themen