J'essaie de déboguer une application qui obtient une exception invalide.
La ligne d'échec est 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? P> (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) P> Capture d'écran Visual Studio http://img18.imageshack.us/img18/3897/invaldicast.png P> < P> Toute aide sur la façon dont je pourrais enquêter plus loin sur cela? p> p>
8 Réponses :
Vous pouvez utiliser: p> ou, bien sûr, raccourcir cela à: p> Parce qu'il y a une étape de démolition impliquée, vous avez besoin de 2 étapes. p> p> ligne [dénominateur] code> est de type
objet code>. Il contient un "COXED"
double code>. Vous ne pouvez convertir que des valeurs boxées à leur type d'origine. Et ensuite faire les conversions normales.
Essayez de la jeter à un double code> d'abord. La ligne
[Denominator] code> est en boîte, de sorte qu'un moulage droit sur
décimal code> ne fonctionnera pas. P>
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]);
Une suggestion: essayez d'utiliser convert.todecimal () au lieu de moulage direct. p>
J'essayerais
decimal d = 0; if (!decimal.TryParse(row[denominator], out d)) //do something
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:
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é a> p>
juste faire
decimal d = Convert.ToDecimal(row[denominator]);
Ce qui est retourné semble être un objet qui contient un double et non un double droit.