In C# ist es möglich, cast List<Kinder> Liste<Parent>?
Möchte ich etwas wie das hier tun:
List<Child> childList = new List<Child>();
...
List<Parent> parentList = childList;
Jedoch, weil parentList ist ein Liste des Kindes Vorfahren, eher als ein direkter Vorfahr, ich bin nicht in der Lage, dies zu tun. Gibt es eine Abhilfe (außer dem hinzufügen jedes element einzeln)?
InformationsquelleAutor der Frage Matthew | 2009-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gießen direkt ist nicht zulässig, weil es gibt keinen Weg, um es typesafe. Wenn Sie eine Liste der Giraffen, und Sie warf es auf eine Liste der Tiere, Sie könnten dann setzen Sie einen tiger in eine Liste von Giraffen! Der compiler würde nicht aufhören, Sie, weil natürlich ein tiger kann in eine Liste von Tieren. Der einzige Ort, der compiler kann Sie stoppen, ist an der unsicheren Konvertierung.
In C# 4 werden wir die Unterstützung von Kovarianz und Kontravarianz von SICHEREN Schnittstellen und Delegaten sind Typen, die mit parametrisierten Referenz-Typen. Für details siehe hier:
http://blogs.msdn.com/ericlippert/archive/tags/Covariance+und+Kontravarianz/default.aspx
InformationsquelleAutor der Antwort Eric Lippert
Mithilfe von LINQ:
Dokumentation für
Cast<>()
InformationsquelleAutor der Antwort recursive
Zurück im Jahr 2009 Eric neckte uns, dass sich die Dinge ändern, die in C# 4. Also, wo stehen wir heute?
Die Klassen, die in meiner Antwort kann gefunden werden an der Unterseite. Um dies zu erleichtern, zu Folgen, verwenden wir eine
Mammal
Klasse als "Elternteil", undCat
undDog
Klassen als "Kinder". Katzen und Hunde sind beides Säugetiere, aber eine Katze ist kein Hund und ein Hund ist keine Katze.Dies ist immer noch nicht legal, und kann nicht sein:
Warum nicht? Katzen sind Säugetiere, also warum können wir nicht zuweisen eine Liste von Katzen, eine
List<Mammal>
?Weil, wenn wir durften zum speichern eines Verweises auf eine
List<Cat>
imList<Mammal>
variable, die wir dann in der Lage zu kompilieren, den folgenden code hinzu, um einen Hund auf eine Liste von Katzen:Wir dürfen nicht zulassen, dass! Denken Sie daran,
mammals
ist nur ein Verweis aufcats
.Dog
nicht absteigen ausCat
und hat kein Geschäft in einer Liste vonCat
Objekte.Mit beginnen .NET Framework 4mehrere generische Schnittstellen haben kovariante Typparameter deklariert mit der
Generic Modifizierer, Schlüsselwort eingeführt, das in C# 4. Unter diesen Schnittstellen ist
IEnumerable<T>
die natürlich umgesetzt wirdList<T>
.Das bedeutet, dass wir kann Form nun eine
List<Cat>
zu einemIEnumerable<Mammal>
:Können wir nicht fügen Sie eine neue
Dog
zumammalsEnumerable
weilIEnumerable<out T>
ist ein "read-only" - Schnittstelle, d.h. es hat keineAdd()
Methode, aber wir kann jetzt verwendencats
überall dort, wo einIEnumerable<Mammal>
konsumiert werden können. Zum Beispiel können wir verkettenmammalsEnumerable
mit einemList<Dog>
um wieder eine neue Folge:Klasse Definitionen:
InformationsquelleAutor der Antwort Stephen Kennedy
ja, Sie können es tun, wie
InformationsquelleAutor der Antwort caras
Können Sie tun dies durch die Verwendung einer Linq-Ansatz des apply-extension-Methode, D. H.:
InformationsquelleAutor der Antwort Md Shoaib Alam