Announcement

Collapse
No announcement yet.

IEnumerable<T>

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • IEnumerable<T>

    Hi

    Ich habe eine Klasse, die das Interface IEnumerable<T> realisiert.
    [highlight=c#]
    //...
    #region IEnumerable<Medium> Members

    public IEnumerator<Medium> GetEnumerator()
    {
    return arrMedien.GetEnumerator();
    }

    #endregion

    #region IEnumerable Members

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

    #endregion
    //...[/highlight]

    Ich verstehe den Nutzen von der 2. Methode nicht. Aber ich muss sie implementieren.

    Kann mir jemand sagen wozu sie da ist?

    Danke,

    mfg sven

  • #2
    Hallo,

    beispielsweise greift die foreach-Schleife intern auf diesen Enumerator zurück. Ohne eine solche Methode ist die foreach-Schleife nicht möglich. (Es gibt sicher noch andere Antworten.)

    Jürgen

    Comment


    • #3
      Hab deine aussage gerade geprüft.

      Das stimmt nicht.

      Hab einfach in jede Methode ne Ausgabe gebaut und es wird immer die obere aufgerufen.
      Alles andere wäre auch komisch, da die 2. Methode private ist.

      Ich glaube, dass sie wirklich nutzlos ist. Sie muss wohl nur existieren, weil IEnumerable<T> von IEnumerable abgeleitet ist.

      mfg
      Zuletzt editiert von Sven S; 30.10.2008, 19:59.

      Comment


      • #4
        Das generische Interface IEnumerable<> implementiert(der Begriff ist bei Interfaces falsch aber mir fällte gerade der richtige nicht ein) auch das nicht generische IEnumerable Interface wie du schon bemerkt hast.

        Du mußt also auch beide implementieren. Da der Typ IEnumerator<> das von GetEnumerator zurückgeliefert wird auch ein IEnumerator ist sind die Signaturen der GetEnumerator Methoden von IEnumerable<> und IEnumerator nicht eindeutig unterscheidbar und können nicht einfach beide normal implementieren werden. Deshalb wird die GetEnumerator Methode von IEnumerator explizit implementiert. Das ist was anderes als das von dir angenommene private.

        Explizit heißt sie kann nicht über die Klasse angesprochen werden sondern nur über das Interface.
        Wenn du also deine Klasse vorher auf das Interface castest oder wie unten im Beispiel diese nur über eine IEnumerable Variable ansprichst so wird die explizite Version benutzt. Warum der Erfinder von IEnumerable<> von IEnumerable abgeleitet hat ist mir dann auch nicht klar.Vermutlich gibt es einen zwingenden Grund warum das casting zwischen IEnumerable<> und IEnumerable möglich sein muß damit bestimmte Features wie z.B. foreach funktionieren(weil z.B auf die Existenz von IEnumerable geprüft wird ohne die Implementierung dann zu nutzen sondern die überschriebene generische Version von GetEnumerator).

        [Highlight=c#]// angenommen MediumList wäre deine IEnumerable<int> Klasse
        System.Collections.IEnumerable mediumList = new MediumList();

        foreach (int i in mediumList )
        {
        }
        [/Highlight]

        Comment


        • #5
          wow! Danke!

          das ist sehr aufschlussreich.

          ich will mich nich zu weit aus dem fentser hängen, aber ich glaube das gesuchte wort lautet "realisiert", oder?!?


          mfg sven

          Comment


          • #6
            Der Sprachgebrauch gefällt mir.
            Das Interface IEnumerable<> realisiert Interface IEnumerable.

            Ist aber wohl eher nicht das gesuchte. Da das ganze ohne Implementierung wenig real ist. Im Englischen spricht man ja auch manchmal von virtual inheritance wenn interface inheritance gemeint ist.

            Comment

            Working...
            X