Problème de cast sur une classe heritée

Résolu
Fjohn666 Messages postés 6 Date d'inscription samedi 24 juillet 2004 Statut Membre Dernière intervention 2 novembre 2008 - 30 oct. 2008 à 19:02
Fjohn666 Messages postés 6 Date d'inscription samedi 24 juillet 2004 Statut Membre Dernière intervention 2 novembre 2008 - 2 nov. 2008 à 20:47
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

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

++
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
31 oct. 2008 à 00:27
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-
3
Fjohn666 Messages postés 6 Date d'inscription samedi 24 juillet 2004 Statut Membre Dernière intervention 2 novembre 2008
2 nov. 2008 à 20:47
merci pour vos reponses.
0
Rejoignez-nous