Wenn zu dem Zeitpunkt, zu IList<T>
erfunden wurde, hatte Microsft bewusst, dass zukünftige Versionen von .NET-Schnittstelle Kovarianz und Kontra unterstützen würden, wäre es möglich gewesen, und nützlich, um die Schnittstelle in IReadableList<out T>
zu spalten, IAppendable<in T>
und IList<T>
die würde beide der oben genannten erben. Dies hätte den vb.net-Implementierern eine kleine Menge zusätzlicher Arbeit auferlegt (sie müssten sowohl die schreibgeschützte als auch die schreibgeschützte Version der indizierten Eigenschaft definieren, da .NET aus irgendeinem Grund kein Lesen-Schreiben zulässt Eigenschaft, die als schreibgeschützte Eigenschaft dienen soll, würde aber bedeuten, dass Methoden, die Elemente aus einer Liste einfach lesen müssen, IReadableList<T>
kovariant empfangen können und Methoden, die einfach eine Sammlung benötigen, an die sie anhängen können, eine IAppendable<T>
in kontravarianter Form erhalten Mode. Die einzige Möglichkeit, wie eine solche Sache heute implementiert werden könnte, wäre leider, wenn Microsoft ein Mittel für neue Schnittstellen zur Verfügung stünde, die für ältere austauschbar wären, wobei Implementierungen der alten Schnittstellen automatisch Standardmethoden verwenden, die von den neuen bereitgestellt werden. Ich würde denken, dass ein solches Feature (Austauschbarkeit der Benutzeroberfläche) sehr hilfreich wäre, aber ich würde meinen Atem nicht anhalten und darauf warten, dass Microsoft es implementiert.
Da es keine Möglichkeit gibt, IReadableList<T>
in IList<T>
zu hinterlegen, wäre ein alternativer Ansatz, die eigene listenbezogene Schnittstelle zu definieren. Die einzige Schwierigkeit dabei ist, dass alle Instanzen von System.Collections.Generic.List<T>
durch einen anderen Typ ersetzt werden müssen, obwohl die Schwierigkeit, dies zu tun, minimiert werden könnte, wenn man eine List<T>
Struktur in einem anderen Namensraum definieren würde, der ein einzelnes System.Collections.Generic.List<T>
Feld enthält Definierte Erweiterungskonvertierungen zum und vom Systemtyp (mit einer Struktur statt einer Klasse würde bedeuten, dass Code es überflüssig macht, neue Heap-Objekte beim Casting in einem Szenario zu erstellen, in dem die Struktur nicht eingerahmt werden müsste).
Um die zugrunde liegenden Probleme dieser Frage in Bezug auf das generalisierte Problem der Typumwandlung in .NET zu beheben, lesen Sie bitte meine Antwort auf eine verwandte Frage unter [Wie kann ich Typen zur Laufzeit konvertieren?] (Http://stackoverflow.com/ Fragen/312858/how-can-ich-Convert-Typen-zur Laufzeit/7942350 # 7942350) –