9
votes

Pourquoi est-ce que je reçois InvalidCastException lors de la coulée d'un double à décimal?

J'essaie de déboguer une application qui obtient une exception invalide. La ligne d'échec est xxx

l'inspectant dans le débogueur (voir capture d'écran ci-dessous), la ligne [Denominator] contient un double avec la valeur 8.0 autant que je puisse dire. SURLY, il ne devrait pas y avoir de problème qui pose problème à une décimale?

(le type "lignes" provient de 3. La bibliothèque de parti , qui est à nouveau remplie de données de MySQL. La question découlée lors de l'essai sur un serveur MySQL plus ancien qui renvoie apparemment certains agrégats comme Double VS Decimal sur MySQL 5.1 - Même requête, même copie de données dans la base de données)

Capture d'écran Visual Studio http://img18.imageshack.us/img18/3897/invaldicast.png < P> Toute aide sur la façon dont je pourrais enquêter plus loin sur cela?


1 commentaires

Ce qui est retourné semble être un objet qui contient un double et non un double droit.


8 Réponses :


4
votes

ligne [dénominateur] est de type objet . Il contient un "COXED" double . Vous ne pouvez convertir que des valeurs boxées à leur type d'origine. Et ensuite faire les conversions normales.

Vous pouvez utiliser: xxx

ou, bien sûr, raccourcir cela à: xxx

Parce qu'il y a une étape de démolition impliquée, vous avez besoin de 2 étapes.


0 commentaires

2
votes

Essayez de la jeter à un double d'abord. La ligne [Denominator] est en boîte, de sorte qu'un moulage droit sur décimal ne fonctionnera pas.


0 commentaires

6
votes

Vous devez le jeter à un double premier comme ligne [dénominateur] code> est une double boîte en boîte comme objet I.e.

decimal d = (decimal)((double)row[denominator]);


0 commentaires

4
votes

Une suggestion: essayez d'utiliser convert.todecimal () au lieu de moulage direct.


0 commentaires

4
votes

J'essayerais

decimal d = 0;
if (!decimal.TryParse(row[denominator], out d))
    //do something


0 commentaires

2
votes

Juger du message d'erreur et description Je suppose que la ligne [Denominator] est une double boîte, donc de type objet. Unboxing ne peut être effectué que sur le type de datattype sous-jacent correct, car l'exécution ne peut désormais trouver l'opérateur de conversion réel du double à décimal (dans votre cas, il essaie de trouver un opérateur qui convertit l'objet à la décimale, mais celui-ci est un Opérateur de non-interoxing et le type sous-jacent n'est pas décimal. Donc, la bonne façon doit être de convertir d'abord à doubler, puis à décimal: xxx


0 commentaires

14
votes

Eric Lippert a blogué exactement cela en profondeur. Je suis d'accord c'est inintuciant au début, mais il l'explique bien: Représentation et identité


0 commentaires

0
votes

juste faire

decimal d = Convert.ToDecimal(row[denominator]);


0 commentaires