Problème de cast sur une classe heritée

[Résolu]
Signaler
Messages postés
6
Date d'inscription
samedi 24 juillet 2004
Statut
Membre
Dernière intervention
2 novembre 2008
-
Messages postés
6
Date d'inscription
samedi 24 juillet 2004
Statut
Membre
Dernière intervention
2 novembre 2008
-
Bonjour a tous,
j'ai un problème,peut etre de logique, de cast :
je voudrais faire une list<T> améliorée avec des fonctions maison :
Voici donc ce que je fais :

public class BaseList<T> : List<T>
{
    public string MafunctionPerso()
    {
        return "blablablablabla";
    }
}

Dans mon programme principal je dois, arrivé un moment, utiliser la methode FindAll() . Je fais donc ca :

BaseList b = new BaseList();
b.Add(69);
b.Add(70);
b.Add(71);
b.Add(72);
BaseList b2 = new BaseList(); // inutile dans l'exemple mais pour simplifier j'ai besoin de stocker la valeur dans cette variable
b2 = (BaseList)b.FindAll(delegate(int a) { return a > 70; });

C'est sur la derniere ligne que j'ai une erreur. En effet la methode FindAll de List<T> retourne un type List<T>. Comme ma BaseList<T> herite de List<T> je pensais que je pourrais caster un List<T> en BaseList<T> (après tout toutes les methodes et attribus de List<T> se trouve dans  BaseList<T> ...) mais il semblerait que ce ne soit pas possible de cette façon. Je vous retourne l'erreur :

Impossible d'effectuer un cast d'un objet de type 'System.Collections.Generic.List`1[System.Int32]' en type 'BaseList`1[System.Int32]'.

Pouvez vous m'expliquer pourquoi ?  Est ce une erreur de logique ?  ou  une particularité  du langage ?

Merci d'avance

3 réponses

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Bonjour,
Oui c'est une erreur logique :)
Correction:
b2.AddRange(b.Findall(delegate(int a){return a>70;});

++
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Autres solutions:

public
class
Program
{
  
public
static
void Main(
string[] args)
   {
     
BaseList<
int> baseL =
new
BaseList<
int>() { 69, 70, 71, 72 };
     
BaseList<
int> baseLFileted =
new
BaseList<
int>(baseL.Where(b => b > 70));
   }
}

public
class
BaseList<T> :
List<T>
{
  
public BaseList() { }

  
public BaseList(
IEnumerable<T> e)
   {
     
base.AddRange(e);
   }
}

<hr />
-My Blog-
Messages postés
6
Date d'inscription
samedi 24 juillet 2004
Statut
Membre
Dernière intervention
2 novembre 2008

merci pour vos reponses.