Der Quellentyp 'ListPerson' kann nicht in IListISomething konvertiert werden

7

Das könnte eine ziemlich einfache Frage sein, aber etwas ergibt für mich keinen Sinn.

Gegeben diese Klasse:

%Vor%

Warum ist das in Ordnung?

%Vor%

Aber das ist nicht?

%Vor%

Warum kann ich eine IEnumerable IClonable, aber keine IList ICloneable zuweisen?

    
Xinbi 25.09.2014, 19:11
quelle

3 Antworten

11

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.

    
Patrice Gahide 25.09.2014, 19:35
quelle
5

IList :

%Vor%

IEnumerable :

%Vor%

Beachten Sie die out in IEnumerable ? IEnumerable<T> ist kovariant

    
Matt Burland 25.09.2014 19:21
quelle
2

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.

    
KC-NH 25.09.2014 19:17
quelle

Tags und Links