Entwickler-Ecke
Basistechnologien - Collection: IEnumerable.GetEnumerator() Rückgabetyp
Delete - Fr 03.04.09 08:28
Titel: Collection: IEnumerable.GetEnumerator() Rückgabetyp
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| public class FooCollection : IList<Foo> { public IEnumerator<Foo> GetEnumerator() { for (int i = 0; i < this._Items.Length; i++) { yield return this._Items[i]; } }
private Foo[] _Items = {}; } |
| C#-Compiler hat folgendes geschrieben: |
"FooCollection" implementiert den Schnittstellenmember "System.Collections.IEnumerable.GetEnumerator()" nicht.
"FooCollection.GetEnumerator()" hat nicht den entsprechenden Rückgabetyp "System.Collections.IEnumerator" und kann "System.Collections.IEnumerable.GetEnumerator()" daher nicht implementieren. |
Ich habe die Definition so aus der IEnumerable übernommen und nur den Datentyp auf "IEnumerator<
Foo>" angepasst. Ist evtl. die Definition meines Arrays "_Items" falsch?
Edit: Die Definition habe ich aus der
IEnumerable<T> übernommen. Sind ja zwei verschiedene Schnittstellen.
Edit 2: Ich glaube ich wollte das Rad neu erfinden. Ich habe gerade die "System.Collections.CollectionBase" gefunden und werde da mal reinschauen.
Kha - Fr 03.04.09 10:07
Neurologic Scientist hat folgendes geschrieben : |
| Ich glaube ich wollte das Rad neu erfinden. Ich habe gerade die "System.Collections.CollectionBase" gefunden und werde da mal reinschauen. |
Jupp, das wird wahrscheinlich die richtige Basisklasse sein.
Zu deinem ursprünglichen Problem: Er beschwert sich nicht über die Implementation von IEnumerable<T>, sondern von IEnumerable! Die kürzeste Lösung (Delphi-Prism-User werden uns jetzt auslachen ;) ):
C#-Quelltext
1: 2:
| public IEnumerator<Foo> GetEnumerator() { return items.GetEnumerator(); } public IEnumerator IEnumerable.GetEnumerator() { return items.GetEnumerator(); } |
Christian S. - Fr 03.04.09 10:12
IList<T> ist abgeleitet von ICollection<T>, IEnumerable<T>, IEnumerable, deshalb musst Du auch noch die nicht-generische GetEnumerator-Methode implementieren.
Delete - Sa 04.04.09 11:37
Ich habe nicht gewusst, dass ich direkt auf die Schnittstelle implementieren muss. Und den Enumerator des Arrays habe ich auch nicht aufgerufen. Wieder etwas gelernt.
Die CollectionBase kann ich nun doch nicht verwenden, da ich bereits von einer BaseModel-Klasse ableite. Also werde ich doch die Collection selbst schreiben, aber anstatt einen Array "Foo[]" dann doch eine ArrayList verwenden.
Zu diesem Thread:
Fachinformatiker.de :: C#.net, Collections [
http://forum.fachinformatiker.de/net/68075-c-net-collections.html#post1134281]
Vielleicht kann mir jemand von Euch eine Antwort auf meine Frage geben. Warum wird in dem Codelisting auf "base.InnerList" anstelle von "this.InnerList" zugegriffen?
Kha - Sa 04.04.09 11:45
Neurologic Scientist hat folgendes geschrieben : |
| Die CollectionBase kann ich nun doch nicht verwenden, da ich bereits von einer BaseModel-Klasse ableite. Also werde ich doch die Collection selbst schreiben, aber anstatt einen Array "Foo[]" dann doch eine ArrayList verwenden. |
Wenn dir das Design wirklich keine andere Wahl lässt, dann bitte wenigstens eine
List<Foo> ;) .
Neurologic Scientist hat folgendes geschrieben : |
| Vielleicht kann mir jemand von Euch eine Antwort auf meine Frage geben. Warum wird in dem Codelisting auf "base.InnerList" anstelle von "this.InnerList" zugegriffen? |
Eigener Stil des Autors, imo aber nicht wirklich verbreitet.
Delete - Sa 04.04.09 11:55
Kha hat folgendes geschrieben : |
| Wenn dir das Design wirklich keine andere Wahl lässt, dann bitte wenigstens eine List<Foo> ;) . |
Ah, Danke. Man lernt ja nie aus.
Kha hat folgendes geschrieben : |
| Eigener Stil des Autors, imo aber nicht wirklich verbreitet. |
Dachte ich mir.
Vielen Dank an Euch. Bin wieder ein ganzes Stück weitergekommen in meinem Projekt.
Schönes Wochenende.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!