olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 2010
-
24 févr. 2008 à 14:19
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDerniè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);
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 201137 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)
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.
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 ;-)