
Envoyé par
tomlev
Tu es sûr que c'est exactement ça le message?
Le message exact est
Impossible de convertir implicitement le type 'classeDeBase' en 'ClasseDerivee. Une conversion explicite existe,
(un cast est-il manquant)?
.
Je crois plutôt que mon problème vient d'une mauvaise utilisation des classes génériques. Je n'ai pas voulu créer un post trop long et j'ai péché par excès de simplification. Voici un exemple plus complet:
Je possède une classe de base appelée "article". Certains peuvent être assemblés. J'ai donc une classe générique "composant" qui décrit le comportement commun de ces articles.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
public class Article
{
private int _identifiant;
private string _nom;
public int Identifiant
{
get { return _identifiant; }
set
{
if (value != _identifiant)
_identifiant = value;
}
}
public string Nom
{
get { return _nom; }
set
{
if (value != _nom)
_nom = value;
}
}
}
public class composant<untype> : Article
{
private bool _venduSeul;
public bool VenduSeul
{
get { return _venduSeul; }
set
{
if (value != _venduSeul)
_venduSeul = value;
}
}
}
public class Electronique : composant<Electronique>
{
private bool _courantContinu;
public bool CourantContinu
{
get { return _courantContinu; }
set
{
if (value != _courantContinu)
_courantContinu = value;
}
}
}
public class Mecanique : composant<Mecanique>
{
public bool _recyclable;
public bool Recyclable
{
get { return _recyclable; }
set
{
if (value != _recyclable)
_recyclable = value;
}
}
} |
Les composants peuvent être assemblés. Un assemblage Electronique ne contient que des éléments électroniques, un assemblage mécanique ne contient que des éléments mécaniques.
J'ai alors les classes suivantes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
public class Assemblage<untype> : Article
{
List<composant<untype>> _elements;
public List<composant<untype>> Elements
{
get { return _elements; }
set
{
if (value != _elements)
_elements = value;
}
}
public composant<untype> ElementAt(int position)
{
if ((_elements != null) && (_elements.Count > 0))
{
return _elements[position];
}
else
return default(composant<untype>);
}
}
public class solution1 : Assemblage<Mecanique>
{
}
public class solution2 : Assemblage<Electronique>
{
} |
On arrive alors à mon problème:
1 2 3 4 5 6 7 8 9
|
public void main()
{
solution2 unevariable= new solution2();
//divers traitements ici
Electronique unElement=unevariable.ElementAt(0); //ligne1
Electronique unAutreElement=(Electronique) unevariable.ElementAt(0); //ligne2
} |
La ligne 1 ne passe pas l'étape de la compilation, le message d'erreur est:
Impossible de convertir implicitement le type 'composant<Electronique>' en 'Electronique. Une conversion explicite existe,
(un cast est-il manquant)?
la ligne 2 passe la compilation, mais plante à l'exécution avec le même message.

Envoyé par
PitMaverick78
Pourquoi ne pas utiliser "is" et "as"? C'est plus souple et moins brutal
est-ce que
Electronique unAutreElement=(unevariable.ElementAt(0) as Electronique);
à la place de
Electronique unAutreElement=(Electronique) unevariable.ElementAt(0);
fonctionnerait?
Partager