Pourquoi ne puis-je utiliser AddRange pour ajouter des éléments sous-classés?
-
21-08-2019 - |
Question
J'ai deux classes .... colis et FundParcel ... et je suis en train de convertir un IEnumerable du sous-type à un IList du supertype ....
public class FundParcel : Parcel
{
/* properties defined here */
}
public class Parcel
{
/* properties defined here */
}
Ceux-ci sont utilisés dans une autre classe dans une méthode comme suit:
private IList<Parcel> ExtractParcels(IEnumerable<FundParcel> fundParcels)
{
var parcels = new List<Parcel>();
foreach (var fp in fundParcels)
parcels.Add(fp);
return parcels;
}
Ce que je ne comprends pas pourquoi l'instruction foreach ne peut être réduite à:
parcels.AddRange(fundParcels);
Je reçois essentiellement une erreur « Type d'argument 'System.Colection.Generic.IEnumerable<FundParcel>' is not assignable to parameter type 'System.Collections.Generic.IEnumerable<Parcel>'"
Mais si tel est le cas, alors je ne comprends pas pourquoi fonctionne parcels.Add ...
Je me sens comme si toute la méthode doit être remplacée par la ligne:
return (List<Parcel>)fundParcels;
... ou peut-être la méthode peut être mis au rebut alltogether puisque les sous-types doivent être substituable pour leur .. supertype
Quelqu'un peut-il expliquer ce que l'affaire est avec AddRange dans ce cas et pourquoi la boucle peut être nécessaire dans ce cas?
La solution
Cette volonté SO probablement répondre à votre question et aussi vous indiquer les références sur les prochains C # 4.0 qui soutiendront la variance Contra co / dans une certaine mesure.
Autres conseils
Considérez ce code:
void AddParcelToParcelList(List<Parcel> parcels) {
parcels.add(new Parcel());
}
List<FundParcel> fundParcels = new List<FundParcels>();
AddParcelToParcelList(fundParcels);
Si des conteneurs de classes héritées également héritées de conteneurs des classes de base, le code ci-dessus serait valide et générer un cas où une liste de la classe héritée contient un objet de la classe de base.