C# 为什么我在将双精度转换为十进制时会得到InvalidCastException

C# 为什么我在将双精度转换为十进制时会得到InvalidCastException,c#,.net,exception,C#,.net,Exception,我正在尝试调试一个获得InvalidCastException的应用程序。 失败的路线是 decimal d = (decimal)row[denominator]; 在调试器中检查这一点(参见下面的屏幕截图),就我所知,行[Denominor]持有一个值为8.0的double。很显然,将其转换为小数点不会有任何问题吧 (row类型是from,它也是从MySQL的数据中填充的。 这个问题是在测试一个旧的MySQL服务器时出现的,该服务器在MySQL 5.1上以双精度vs十进制的形式返回一些聚合

我正在尝试调试一个获得InvalidCastException的应用程序。 失败的路线是

decimal d = (decimal)row[denominator];
在调试器中检查这一点(参见下面的屏幕截图),就我所知,行[Denominor]持有一个值为8.0的double。很显然,将其转换为小数点不会有任何问题吧

(row类型是from,它也是从MySQL的数据中填充的。 这个问题是在测试一个旧的MySQL服务器时出现的,该服务器在MySQL 5.1上以双精度vs十进制的形式返回一些聚合(相同的查询,数据库中数据的完全相同副本)


关于如何进一步调查此问题的任何帮助?

行[分母]
属于
对象类型。它包含一个“装箱的”
double
。只能将装箱的值转换回其原始类型。然后进行正常的转换

您可以使用:

double d1 = (double)row[denominator];
decimal d = (decimal) d1;
当然,也可以将其缩短为:

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

因为涉及到一个拆箱步骤,所以需要两个步骤。

首先尝试将其转换为
双精度。
行[分母]
已装箱,因此直接转换为
十进制
将不起作用。

您需要先将其转换为双精度,因为
行[分母]
是双精度装箱对象 i、 e


建议:尝试使用Convert.ToDecimal()而不是直接强制转换。

我会试试

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


从错误消息和描述判断,我假设行[Denominor]是一个装箱双精度,所以是object类型。取消装箱只能对正确的基础datattype执行,因为运行时现在不知道在哪里可以找到从double到decimal的实际转换运算符(在您的情况下,它试图找到一个将对象转换为十进制的运算符,但该运算符是取消装箱运算符,并且基础类型不是十进制。因此,正确的方法应该是先转换为双精度,然后再转换为十进制:

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

埃里克·利珀特(Eric Lippert)在博客中对此进行了深入探讨。我同意一开始这并不直观,但他解释得很好:

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

这样,您就不必担心所有的铸造问题。

返回的似乎是一个包含双精度而不是直双精度的对象。
decimal d = (decimal)(double)row[denominator];
decimal d = Convert.ToDecimal(row[denominator]);