Autor Beitrag
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 03.04.09 08:28 
ausblenden 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>
{
  /*
   * Members:
   * IEnumerable
   */

  public IEnumerator<Foo> GetEnumerator()
  {
    for (int i = 0; i < this._Items.Length; i++)
    {
      yield return this._Items[i];
    }
  }

  /*
   * Implementations:
   * ICollection, IList
   */

   // ...

  /*
   * Property:
   * _Items
   */

  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 03.04.09 10:07 
user profile iconChristian R. hat folgendes geschrieben Zum zitierten Posting springen:
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 ;) ):
ausblenden C#-Quelltext
1:
2:
public IEnumerator<Foo> GetEnumerator() { return items.GetEnumerator(); }
public IEnumerator IEnumerable.GetEnumerator() { return items.GetEnumerator(); } // explicit interface implementation

_________________
>λ=
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 04.04.09 11:45 
user profile iconChristian R. hat folgendes geschrieben Zum zitierten Posting springen:
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> ;) .

user profile iconChristian R. hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
>λ=
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.04.09 11:55 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Wenn dir das Design wirklich keine andere Wahl lässt, dann bitte wenigstens eine List<Foo> ;) .

Ah, Danke. Man lernt ja nie aus.

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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.