Caprices de conversion

Résolu
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 24 févr. 2008 à 14:19
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 24 févr. 2008 à 18:25
Bonjour, j'essaye de m'acoutumer aux caprices de conversion en C# mais ce n'est pas évident voici quelques exemples de conversion d'une cellule d'un datagridrow

int a = (
int)cRow.Cells[
"X"].Value;      // Ca marche
dX = (
double)a;   // mais je dois convertir en double
dX = (

double)cRow.Cells[
"Y"].Value;  // Ca marche pas POURQUOI ??

double.TryParse(cRow.Cells[
"X"].Value.ToString(),
out dX);  // ca marche mais semble plus chipoteux (passage par string)

double.TryParse(cRow.Cells[
"Y"].Value.ToString(),
out dY);

Quelle est la meilleure methode ?

4 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
24 févr. 2008 à 15:55
Salut

Bizarre comme comportement

Mais avec
double a = Convert.ToDouble(monDataGridView.Rows[1].Cells[1].Value)

Ca fonctionne,

La raison est que le double resultat de la convertion est un objet System.Double et non une valeur de type valeur double
Et on ne peut convertir un objet (présent dans une cellule de gridview en type valeur, il faut passer par un cast objet. (en gros un ctype ou un directcast en vb.net)
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 févr. 2008 à 17:09
Salut,

Caprices ?

"// Ca marche pas POURQUOI ??" = > Parce que !!
Non sérieux, tu ne peux pas être plus explicite ?
Si c'est à la compilation, en général le compilo donne un numéro d'erreur et un texte, non pas pour faire son malin mais pour aider le dev à comprendre ce qui ne vas pas.
Si c'est au runtime, les exceptions sont aussi assez souvent plus explicites que CaMarchePasException.

Le passage par ToString est effectivement contre indiqué, à moins de vraiment vouloir faire bosser le GC pour rien.

Le mot clé C# "double" n'est rien d'autre qu'un alias du type System.Double, passé la compilation double n'existe plus.

En l'occurence, "dX = (double)cRow.Cells["Y"].Value;" provoque la levée d'une exception InvalidCastException, pourquoi ?
cRow.Cells["Y"].Value est une valeur Int32 (si j'en crois l'énoncé initial) boxée en Object.

Prenons le code suivant :

Int32 monInt = 1;
Object monIntBoxe = monInt;

Convert1(monInt);
Convert3(monIntBoxe);
Convert2(monIntBoxe);

Code des méthodes Convert* :

private static double Convert1(Int32 value)
{
    return (double)value;
}



private static double Convert2(Object value)
{
    return (double)value;
}



private static double Convert3(Object value)
{
    return (double)(Int32)value;
}





Pourquoi Convert1 et Convert3 fonctionnent alors que Convert2 explose ? On va dire que le compilateur a encore des choses à apprendre, sans entrer dans les problématiques post-JIT que je ne maitrise pas du tout.

Convert1
Le compilateur sait que value est un Int32
IL produit :
  IL_0000:  ldarg.0  // chargement du premier argument sur la stack
  IL_0001:  conv.r8  // conversion de la valeur en haut de la stack en float64
  IL_0002:  ret

Convert3
Le compilateur nous fait confiance, on lui a dit que l'object est en réalité un Int32.
IL produit :
  IL_0000:  ldarg.0  // chargement du premier argument sur la stack
  IL_0001:  unbox.any  [mscorlib]System.Int32  // unboxing de la valeur en haut de la stack en Int32
  IL_0006:  conv.r8  // conversion de la valeur en haut de la stack en float64
  IL_0007:  ret

Convert2
Le compilateur nous fait confiance, on lui a dit que l'object est en réalité un Double.
IL produit :
  IL_0000:  ldarg.0  // chargement du premier argument sur la stack
  IL_0001:  unbox.any  [mscorlib]System.Double  // unboxing de la valeur en haut de la stack en Double :pas de bol, on lui a menti, c'est un Int32
  IL_0006:  ret

Donc en gros, peut être que le compilateur aurait pu deviner, et peut etre le fera t'il quand il aura encore muri, mais à l'heure actuelle c'est toi qui lui ment, donc assume ;-)

/*
coq
MVP Visual C#
CoqBlog
*/
3
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
24 févr. 2008 à 17:31
Chapeau !

Et grand merci pour cette explication tres claire Coq !
J'aime...!
Mais tu a raison j'autais aussi pu faire un effort dans ma question

Merci aussi à nhervagault (la je fais un cut / paste) j'ai trop peur de faire une erreur (C'est un titre de Johan et Pirlouit ?)
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 févr. 2008 à 18:25
De rien :-)

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous