Wenn ich kann Ihr List<Joe> joes
als verallgemeinert werden ...
List<Human> humans = joes;
... die beiden Referenzen humans
und joes
sind, nun weiter auf die exakt gleiche Liste zeigt. Der Code, der der obigen Zuweisung folgt, hat keine Möglichkeit, das Einfügen/Hinzufügen einer Instanz eines anderen menschlichen Typs, etwa eines Klempners, in die Liste zu verhindern.Da class Plumber: Human {}
humans.Add(new Plumber()); // Add() now accepts any Human not just a Joe
der Liste, die humans
bezieht sich auf nun beide Joes und Installateure enthält. Beachten Sie, dass das gleiche Listenobjekt immer noch mit der Referenz joes
bezeichnet wird. Jetzt, wenn ich die Referenz joes
verwende, um aus dem Listenobjekt zu lesen, könnte ich einen Klempner anstelle eines Joes herausbringen. Es ist nicht bekannt, dass Klempner und Joe implizit ineinander übersetzbar sind ... also macht die Tatsache, dass ich einen Klempner anstelle eines Joes von der Liste bekomme, die Art der Sicherheit zunichte. Ein Klempner ist durch einen Verweis auf eine Liste von Joes sicherlich nicht willkommen.
In den letzten Versionen von C# ist es jedoch möglich, diese Einschränkung für eine generische Klasse/Sammlung zu umgehen, indem eine generische Schnittstelle implementiert wird, deren Typparameter einen Modifizierer out
enthält. Sagen wir, wir haben jetzt ABag<T> : ICovariable<out T>
. Der out-Modifizierer beschränkt die T nur auf Ausgabepositionen (z. B. Methodenrückgabetypen). Sie können kein T in den Beutel geben. Sie können sie nur daraus lesen. Dies ermöglicht es uns, Joes auf eine ICovariable<Human>
zu verallgemeinern, ohne dass wir uns Gedanken darüber machen müssen, einen Plumber hinein zu fügen, da die Schnittstelle das nicht erlaubt. Wir können jetzt schreiben ...
ICovariable<Human> humans = joes ; // now its good !
humans.Add(new Plumber()); // error
Dies ist im Grunde das gleiche wie [In C#, warum kann nicht ein Liste Objekt in einer Variablen Liste
, weil "Menschen" sich dann auf eine Instanz von "Liste" beziehen würde, was zu Problemen führen würde, wie in @Jons Beispiel dargestellt. –
yep, nachdem er das Beispiel korrigiert habe ich habe es .. macht Sinn –