我有一个IDataRecord reader我正在检索小数,如下所示:
decimal d = (decimal)reader[0];
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这会抛出一个无效的强制转换异常,说"指定的强制转换无效".
当我这样做reader[0].GetType()时告诉我它是Int32.据我所知,这应该不是问题....
我已经通过这个片段测试了这个,它运行得很好.
int i = 3750;
decimal d = (decimal)i;
Run Code Online (Sandbox Code Playgroud)
这让我头疼不已,想知道为什么它没有将读取器中包含的int取消装箱作为小数.
有谁知道为什么会这样?有什么微妙的我不见了吗?
当值类型被装箱时,它被放置在无类型的引用对象内.那么是什么导致无效的强制转换异常?
long l = 1;
object obj = (object)l;
double d = (double)obj;
Run Code Online (Sandbox Code Playgroud) 我正在尝试调试一个获取InvalidCastException的应用程序.失败的路线是
decimal d = (decimal)row[denominator];
Run Code Online (Sandbox Code Playgroud)
在调试器中检查这个(见下面的截图),row [denominator]保持一个值为8.0的double,据我所知.Surly应该没有任何问题将其转换为小数?
('row'类型来自3.派对库,它再次来自MySQL的数据.当针对较旧的MySQL服务器进行测试时会出现问题,该服务器显然会在MySQL 5.1上将某些聚合返回为double vs decimal - 同样的查询,完全相同数据库中的数据副本)
Visual Studio截图http://img18.imageshack.us/img18/3897/invaldicast.png
有关如何进一步调查此问题的任何帮助?
我想知道为什么下面的downcast失败@运行时间:
情况1:
Object y = 10.23;
Console.WriteLine(y.GetType()); //System.Double
int z = (int)y;// fails @ runtime
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
案例2:
Double y = 10.23;
Console.WriteLine(y.GetType());//System.Double
int z = (int)y;//success
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,y的类型是System.Double,仍然为什么在第一种情况下downcst失败?