Dies wird Kovarianz genannt. Eric Lippert und Jon Skeet (unter anderem) gaben einige schöne Erklärungen der Kovarianz (und ihres Zwillings, contravariance ) in Antworten auf diese Frage: Differenz zwischen Kovarianz & Amp; Contravarianz
Im Grunde genommen können Sie über eine Liste von Person
genau wie bei einer Liste von ICloneable
aufzählen. Es könnte kein Problem auftreten, weil Sie die Aufzählung nicht ändern können. Aber Sie können Ihre Liste von Person
nicht einer Liste von ICloneable
zuweisen, weil Sie später versuchen könnten, zum Beispiel eine andere Ableitung von ICloneable
einzufügen, was zu einer starken Verletzung des Typs führen würde -Sicherheit.
Ich hatte eine andere Antwort, was falsch war. Ich entschuldige mich. Danke Matt, dass du darauf hingewiesen hast.
Die Fehlermeldung ist ziemlich irreführend. Es schlägt vor, dass eine Besetzung funktioniert, aber nicht. Das Problem besteht darin, dass die Konvertierung von Person in ICloneable den Zeiger möglicherweise anpassen muss, damit die virtuelle Funktionstabelle für eine generische ICloneable korrekt ist. Das bedeutet, dass für jedes Element in der Liste eine Anpassung erforderlich ist. Die wirkliche Lösung ist ToList zu verwenden:
%Vor%Ignoriere einige der folgenden Kommentare, da ich meine erste Antwort vollständig gelöscht habe.