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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top