IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Impossible de convertir le type


Sujet :

Windows Forms

  1. #1
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut Impossible de convertir le type
    Bonjour tout le monde,

    j'ai défini une classe mère Mere et une classe fille Fille qui dérive de Mere.
    Dans mère, j'ai déclaré une méthode qui prend en paramètre une liste d'objets Mere.
    Dans une Form, j'ai déclaré et utilise une liste de Fille, je désire appeler la méthode et passe en paramètre cette liste, mais à la compilation, j'ai le message d'erreur :
    Erreur 1 Impossible de convertir le type 'System.Collections.Generic.List<Fille>' en 'System.Collections.Generic.List<Mere>' via une conversion de référence, une conversion boxing, une conversion unboxing, une conversion wrapping ou une conversion null type
    En essayant de typer la List<Fille> en List<Mere> avec AS, cela ne fonctionne pas non plus car ce n'est pas la classe List qu'il faut transtyper mais la classe générique.

    Vu que Fille dérive de Mere, même si le compilateur le refuse, je ne vois pas pourquoi on ne pourrait pas faire fonctionner le code, comment faire pour qu'il fonctionne ?
    Merci.

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Une List<Fille> n'est pas une List<Mere>, parce qu'on peut faire Add(new Mere() ) sur une liste de mère mais pas sur une liste de filles.

    G<A> n'est pas fille de G<B> même si A hérite de B.
    ಠ_ಠ

  3. #3
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    Je sais pourquoi c'est pas possible, ce que je veux savoir c'est comment faire pour que cela marche!!!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par chris81 Voir le message
    Bonjour tout le monde,

    j'ai défini une classe mère Mere et une classe fille Fille qui dérive de Mere.
    Dans mère, j'ai déclaré une méthode qui prend en paramètre une liste d'objets Mere.
    Dans une Form, j'ai déclaré et utilise une liste de Fille, je désire appeler la méthode et passe en paramètre cette liste, mais à la compilation, j'ai le message d'erreur :

    En essayant de typer la List<Fille> en List<Mere> avec AS, cela ne fonctionne pas non plus car ce n'est pas la classe List qu'il faut transtyper mais la classe générique.

    Vu que Fille dérive de Mere, même si le compilateur le refuse, je ne vois pas pourquoi on ne pourrait pas faire fonctionner le code, comment faire pour qu'il fonctionne ?
    Merci.
    Si tu utilises une liste générique tu as une méthode assez simple pour résoudre ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    List<Mere> maListeMere = List<Fille> maListeFille.ConvertAll<Mere>(
    delegate(Fille fille)
     
    {
    return (Mere) fille;
    });

  5. #5
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    Salut varod, merci pour ta solution.
    Le seul petit problème avec ta solution est qu'on ne travaille plus avec la liste originale mais avec une autre instance de Liste qui possède les mêmes objets dedans. Si dans la méthode qui prend la liste en paramètre, je souhaite faire un Add ou un Remove, il ne sera fait que sur la copie et pas l'originale.

    Je me demande s'il ne serait pas mieux d'arriver à faire de l'héritage de liste, je m'explique.
    Si je déclare une classe MereList qui dérive de List<Mere>, je peux rajouter des méthodes et je sais que je ne travaille qu'avec des objets de type Mere.
    Si par la suite, je souhaite déclarer une classe FilleList, soit elle dérive de MereList et donc je ne travaille qu'avec des objets de type Mere et je dois les transtyper en Fille, soit je dérive de List<Fille> et je n'ai pas les nouvelles méthodes rajoutées dans MereList.
    Est-ce que tu connais une solution ?
    Merci.

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par chris81 Voir le message
    Salut varod, merci pour ta solution.
    Le seul petit problème avec ta solution est qu'on ne travaille plus avec la liste originale mais avec une autre instance de Liste qui possède les mêmes objets dedans. Si dans la méthode qui prend la liste en paramètre, je souhaite faire un Add ou un Remove, il ne sera fait que sur la copie et pas l'originale.
    C'est précisément parce que tu veux faire un Add que ça peut pas marcher, cf mon message ci dessus...

    Une autre solution est de changer ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void MaMethode(List<Mere> liste))
    {...}
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void MaMethode<T>(List<T> liste)) where T : Mere
    {...}
    ಠ_ಠ

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par chris81 Voir le message
    Je me demande s'il ne serait pas mieux d'arriver à faire de l'héritage de liste, je m'explique.
    Si je déclare une classe MereList qui dérive de List<Mere>, je peux rajouter des méthodes et je sais que je ne travaille qu'avec des objets de type Mere.
    Si par la suite, je souhaite déclarer une classe FilleList, soit elle dérive de MereList et donc je ne travaille qu'avec des objets de type Mere et je dois les transtyper en Fille, soit je dérive de List<Fille> et je n'ai pas les nouvelles méthodes rajoutées dans MereList.
    Est-ce que tu connais une solution ?
    Merci.
    A vrai dire, tout dépend de ce dont tu as le plus besoin ...

    Dans tous les cas, si Fille hérite de Mère, tu dois voir les méthode de Mère.

    De préférence utilises la une list<Mere> ca t'offre plus de possibilité. Tu peux stocker toutes les filles de mère dedans et caster en cas de besoin.

  8. #8
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    Merci Guulh ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void MaMethode<T>(List<T> liste)) where T : Mere
    {...}
    fonctionne parfaitement

    Merci ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2014, 10h04
  2. [Débutant] Impossible de convertir le type 'short[]' en 'System.IntPtr'
    Par Elriks dans le forum C#
    Réponses: 6
    Dernier message: 02/12/2011, 09h56
  3. [XSLT 1.0] Impossible de convertir le type d'argument/de retour dans la méthode
    Par kevin8100 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2011, 23h24
  4. Réponses: 2
    Dernier message: 19/05/2007, 20h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo