【问题标题】:Why do I get InvalidCastException when casting a double to decimal为什么将双精度转换为十进制时会出现 InvalidCastException
【发布时间】:2009-11-03 12:54:35
【问题描述】:

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

decimal d = (decimal)row[denominator];

在调试器中检查这个(见下面的截图),据我所知,row[denominator] 持有一个值为 8.0 的双精度值。 Surly 将其转换为小数应该没有问题吗?

('row' 类型来自3. party library,它再次由 MySQL 中的数据填充。 在针对旧 MySQL 服务器进行测试时出现问题,该服务器显然在 MySQL 5.1 上返回一些聚合为双精度与十进制 - 相同的查询,数据库中的数据完全相同)

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

对我如何进一步调查有任何帮助吗?

【问题讨论】:

  • 返回的似乎是一个包含双精度而不是直双精度的对象。

标签: c# .net exception


【解决方案1】:

Eric Lippert 曾在博客中对此进行了深入探讨。我同意一开始这很不直观,但他解释得很好:Representation and Identity

【讨论】:

    【解决方案2】:

    您需要先将其转换为双精度,因为 row[denominator] 是双装箱的对象 即

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我会试试的

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

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

        【讨论】:

          【解决方案5】:

          row[denominator] 的类型为 object。它包含一个“盒装”double。您只能将装箱值转换回其原始类型。然后进行正常的转换。

          你可以使用:

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

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

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

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

          【讨论】:

            【解决方案6】:

            先尝试将其转换为doublerow[denominator] 已装箱,因此直接转换为 decimal 将不起作用。

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

                只是做

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-31
                  • 1970-01-01
                  相关资源
                  最近更新 更多