Wenn eine Methode einen Parameter vom Typ System.Collections.IList verwendet, kann ich einen Wert vom Typ System.Collections.Generic.IEnumerable<T>
legitim / sicher übergeben?
Ich würde mich über eine gründliche Erklärung freuen, warum dies möglich ist und was tatsächlich mit dem Objekt T
passiert, wenn das IEnumerable<T>
innerhalb der Methode verwendet wird.
Wird es in den Basistyp von Object konvertiert?
Wird es als System.Collections.IEnumerable
verwendet?
Gibt es Szenarien, in denen dies zu Problemen führt (z. B. zu Leistungsproblemen)?
Vielen Dank im Voraus, John
Nein , Sie können eine IEnumerable<T>
nicht an eine Methode übergeben, die IList
benötigt. Die Schnittstelle IEnumerable<T>
ist nicht in IList
konvertierbar und der Versuch, eine Variable vom Typ IEnumerable<T>
an eine Methode zu übergeben, die IList
übernimmt, führt zu einem Kompilierungsfehler.
Damit dies funktioniert, müssen Sie einen der folgenden Schritte ausführen:
IEnumerable<T>
zu haben, pflegen Sie einen Verweis auf einen Typ, der sowohl IEnumerable<T>
als auch IList
implementiert. List<T>
ist ein guter Kandidat hier IEnumerable<T>
-Instanz in ein neues Objekt, das in IList
konvertierbar ist. In 3.5+ können Sie beispielsweise die Erweiterungsmethode .ToList()
aufrufen, um eine neue List<T>
über die Aufzählung zu erstellen. Nein. Sie können das nicht, ohne die Erweiterungsmethode ToList()
zu verwenden. Ich denke, das sollte nicht zu dem großen Leistungsproblem führen - wenn Sie eine Alternative haben, sollten Sie sie zeitlich abgleichen und vergleichen.
Sie könnten auch new List<T>(myIEnumerable)
verwenden - die Dokumentation besagt, dass diese Funktion ein% ist. co_de% Operation, aber ich kann nichts anderes über O(n)
finden. Beachten Sie auch, dass ToList()
auch List<T>
sowie IList
implementiert.
IEnumerable erlaubt keinen indizierten Zugriff auf die Sammlung, während IList dies tut. Daher ist IList mehr als IEnumerable, und Sie werden damit nicht durchkommen. Natürlich implementieren einige Klassen beide Schnittstellen (zum Beispiel List & lt; & gt;) und diese funktionieren gut.
Wenn Sie von IEnumerable zu IList wechseln müssen, können Sie zuerst eine Besetzung versuchen, wenn Sie Glück haben, wird es funktionieren. Wenn nicht, müssen Sie die IEnumerable-Sammlung überwachen und eine neue IList erstellen.
Bearbeiten: Verwenden Sie ToList (), anstatt sich selbst zu provozieren, wie andere vorgeschlagen haben.
Nein, Sie können es nicht IEnumerable übergeben. IList implementiert IEnumerable. Wenn Sie also Ihrer Methode eine IList übergeben, können Sie sie sicher als IEnumerable verwenden. VS wird das folgende nicht kompilieren:
%Vor%Fehler zurückgegeben:
%Vor%Tags und Links .net generics ienumerable ilist