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

C# Discussion :

Héritage et liste


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut Héritage et liste
    Bonjour à tous,
    Voilà, je découvre dotNet, et je suis étonné de ne pouvoir faire la chose suivante :

    J'ai une classe Object abstraite, et une classe Test qui en dérive.
    Et lorsque j'écris
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Object> list = new List<Test>();

    Le compilo me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot implicitly convert type 'System.Collections.Generic.List<Projet.Test>' to 'System.Collections.Generic.List<Projet.Object>'
    Je suis étonné...

  2. #2
    Tab
    Tab est déconnecté
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 78
    Par défaut
    Etant donné que ton type Test hérite de Object, ils sont compatibles mais il peut y avoir une perte de données en cas de cast implicite, notamment si Test possède des attributs en plus que ceux définis dans Object.

    Un cast est possible mais le compilateur ne peut le faire de manière implicite, il faut que tu caste explicitement Test en Object pour que ça passe.

    Si tu veux plus d'informations sur les conversions de type en c# je te renvoie sur la msdn et plus précisément sur cet article

  3. #3
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut
    Mais pourquoi yaurait de la perte de données, je saisi vraiment pas là...
    J'ai fait une classe abstraite parce que je veux pouvoir manipuler des Test1 comme des Test2, sans savoir lequel je manipule, donc je les fais hériter d'une classe mère, et je fais mes manips avec, mais il n'empêche qu'à la fin je veux récupérer mes Test complets, avec leurs attributs spécifiques.

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    En fait, c'est du au fait que List<T> n'est pas covariant. IEnumerable<T> l'est.
    Cf ce post: http://www.developpez.net/forums/d10...ste-generique/

  5. #5
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut
    Je n'ai pas très bien suivi la notion de covariance et contravariance là...

    Edit : j'ai lu le lien que tu cites en source dans ton autre message, et j'ai appris plein de chose. Et je peste surtout fortement, car je suis en .NET 3.5, et je trouve hallucinant que
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Person> list = new List<Manager>();
    provoque une erreur de compile sachant que Manager hérite de Person que ce soit en 3.5 ou en 4. Je fais ça en Java depuis des années...
    Un très très gros point faible pour DotNet là...

  6. #6
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut
    Du coup je m'en suis sorti en faisant un truc dans ce genre :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Object> list = new List<Object>();
    list.Add(new Test());

    Et ça marche.

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

Discussions similaires

  1. Problème d'héritage de List
    Par Will Fou dans le forum C#
    Réponses: 5
    Dernier message: 22/01/2013, 17h59
  2. Héritage et List
    Par Benoit_T dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2010, 11h42
  3. Héritage et liste variable d'arguments
    Par jimaitou dans le forum Débuter
    Réponses: 9
    Dernier message: 08/03/2009, 19h52
  4. empecher héritage dans liste à puce imbriquées
    Par zamanika dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 15/03/2007, 15h18
  5. Héritage et listes chainées...
    Par syntaxerror dans le forum C++
    Réponses: 7
    Dernier message: 04/05/2005, 20h18

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