将double转换为decimal时,为什么会出现InvalidCastException

时间:2009-11-03 12:54:35

标签: c# .net exception

我正在尝试调试获取InvalidCastException的应用程序。 失败的行是

decimal d = (decimal)row[denominator];

在调试器中检查这个(见下面的截图),就我所知,row [denominator]保持一个值为8.0的double。很可能没有任何问题将其转换为小数?

('row'类型来自3. party library,它再次来自MySQL的数据。 在针对较旧的MySQL服务器进行测试时会出现问题,该服务器显然会在MySQL 5.1上将一些聚合返回为double vs decimal - 相同的查询,数据库中完全相同的数据副本)

Visual Studio Screenshot http://img18.imageshack.us/img18/3897/invaldicast.png

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

8 个答案:

答案 0 :(得分:10)

Eric Lippert已经在博客中详细介绍了这一点。我一开始认为它不直观,但他解释得很好:Representation and Identity

答案 1 :(得分:6)

您需要先将其强制转换为双精度,因为row[denominator]是一个双重框作为对象 即。

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

答案 2 :(得分:4)

我试试

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

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

答案 3 :(得分:3)

您可以使用:

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

或者,当然,将其缩短为:

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

由于涉及拆箱步骤,您需要两个步骤。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

首先尝试将其转换为doublerow[denominator]已装箱,因此直接投放到decimal将无效。

答案 6 :(得分:2)

从错误消息和描述判断我假设行[denominator]是一个盒装双,因此类型为object。取消装箱只能对正确的底层数据类型进行,因为运行时现在不在哪里找到实际的转换操作符从double到decimal(在你的情况下,它试图找到一个将对象转换为十进制的运算符,但那个是一个拆箱操作符和底层类型不是十进制。所以正确的方法应该是先转换为double然后转换为十进制:

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

答案 7 :(得分:0)

只是做

decimal d = Convert.ToDecimal(row[denominator]);
通过这种方式,您不必担心所有的铸造问题。