Ich habe zwei Klassen .... Parcel und FundParcel ... und ich versuche, eine IEnumerable des Subtyps in eine IList der Supertyp ....Warum kann ich AddRange nicht zum Hinzufügen von Unterklasse-Elementen verwenden?
public class FundParcel : Parcel
{
/* properties defined here */
}
public class Parcel
{
/* properties defined here */
}
Diese in einem anderen verwendet werden zu konvertieren Klasse in einem Verfahren, wie folgt:
private IList<Parcel> ExtractParcels(IEnumerable<FundParcel> fundParcels)
{
var parcels = new List<Parcel>();
foreach (var fp in fundParcels)
parcels.Add(fp);
return parcels;
}
Was ich nicht verstehe, warum die foreach ist Aussage nicht zu reduzieren:
parcels.AddRange(fundParcels);
ich im Grunde einen Fehler, der „Arg sagt UMENT Typ 'System.Colection.Generic.IEnumerable<FundParcel>' is not assignable to parameter type 'System.Collections.Generic.IEnumerable<Parcel>'"
Aber wenn das der Fall ist, dann verstehe ich nicht, warum parcels.Add funktioniert ...
Ich fühle mich, als ob das gesamte Verfahren sollte mit der Linie austauschbar sein:
return (List<Parcel>)fundParcels;
... oder vielleicht kann das Verfahren alltogether verschrottet werden, da Subtypen für ihren Supertyp ersetzbar sein sollte ..
jemand erklären kann, was das Geschäft mit AddRange in diesem Fall ist und warum die for-Schleife in diesem Fall notwendig sein kann, ?
Mögliches Duplikat von [Warum unterstützt C#/CLR nicht die Methode zum Überschreiben der Co/Kontra-Varianz?] (Http://StackOverflow.com/Questions/837134/Why-does-cclr-not-support-method- Override-Co-Contra-Varianz) – TheLethalCoder