Frage

Dies gilt Code:

void func(IEnumerable<string> strings){
    foreach(string s in strings){
        Console.WriteLine(s);
    }
}

string[] ss = new string[]{"asdf", "fdsa"};
func(ss);

Was ich wissen will, ist, wie funktioniert die implizite Konvertierung string[] -> IEnumerable<string> Arbeit?

War es hilfreich?

Lösung

aus: Msdn Array-Klasse

  

In der .NET Framework Version 2.0, die Array-Klasse implementiert die

     
      
  • IList<T>,
  •   
  • ICollection<T> und
  •   
  • IEnumerable<T>
  •   
     

generische Schnittstellen. Die Implementierungen sind zur Laufzeit-Arrays zur Verfügung gestellt , und sind daher auf die Dokumentation Build-Tools nicht sichtbar. Als Ergebnis sind die generischen Schnittstellen erscheinen nicht in der Deklaration Syntax für die Array-Klasse, und es gibt keine Referenzthemen für die Schnittstellenelemente, die nur zugänglich sind durch ein Array an den generischen Schnittstellentyp (explizite Schnittstellenimplementierungen) Gießen. Der Schlüssel Sache bewusst zu sein, wenn Sie ein Array an eine dieser Schnittstellen gegossen ist, dass Mitglieder, die hinzufügen, einfügen oder Elemente entfernen NotSupportedException werfen.

Andere Tipps

Array-Klasse, die ein sehr seltsames Tier ist und behandelt wird, ganz besonders durch den Compiler und JIT (mehr dazu in Richters und Don Box-Büchern, ich denke), implementiert IEnumerable<T>.

Arrays implementieren IEnumerable so für jede T [] eine Umstellung auf IEnumerable .

  

Wie funktioniert die implizite Konvertierung string [] -> IEnumerable Arbeit

Diese Art von trifft nicht den Punkt, weil gibt es keine Konvertierung ist. Arrays implementieren (man könnte fast sagen, „erben von“, wenn das mehr Sinn macht für Sie) IEnumerable, und so string [] bereits ein IEnumerable - es gibt nichts zu konvertieren

Dies ist eine Standard-Schnittstelle Umwandlung; als Anforderung, Arrays (T[]) IEnumerable und IEnumerable<T> implementieren. So ein string[] ist 100% kompatibel mit IEnumerable<T>. Die Umsetzung wird durch den Compiler zur Verfügung gestellt (Arrays waren im Grunde generic vor .NET Generika existiert).

Von der Spezifikation (ECMA 334 v4) - dies ist eine Folge von 13.1.4:

  • Von einem eindimensionalen Array-Typ S[] System.Collections.Generic.IList<S> und Base Schnittstellen dieser Schnittstelle.
  • Von einem eindimensionalen Array-Typ zu S[] System.Collections.Generic.IList<T> und Basis Schnittstellen dieser Schnittstelle, vorausgesetzt, es ist eine implizite Referenz Umwandlung von S zu T.

Und erinnert daran, dass IList<T> : IEnumerable<T>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top