我有一个从其中检索小数的IDataRecord reader,如下所示:
decimal d = (decimal)reader[0];由于某种原因,这会抛出一个无效的强制转换异常,说明“指定的强制转换无效”。
当我执行reader[0].GetType()时,它会告诉我这是一个Int32。据我所知,这应该不是问题……
我已经通过这个代码片段测试了这一点,它工作得很好。
int i = 3750;
decimal d = (decimal)i;这让我摸不着头脑,想知道为什么它不能将阅读器中包含的int拆开为小数。
有人知道为什么会发生这种情况吗?我是不是漏掉了什么微妙的东西?
发布于 2009-07-06 01:52:49
您只能将值类型取消装箱为其原始类型(以及该类型的可空版本)。
顺便说一下,这是有效的(这只是您的两行版本的速记):
object i = 4;
decimal d = (decimal)(int)i; // works even w/o decimal as it's a widening conversion要了解本文背后的原因,请阅读此Eric Lippert's blog entry: Representation and Identity
就我个人而言,我将使用强制转换语法完成的操作分为四种不同的操作类型(它们都有不同的IL指令):
box IL指令)和拆箱(通过继承层次结构的unbox IL指令(像C++中的dynamic_cast<Type>一样,使用castclass IL指令在基元类型之间进行转换(就像C++中的static_cast<Type>一样,对于基元类型之间的不同类型的转换有大量的IL指令(在IL级别上,它们只是对适当op_XXX方法的方法调用)。发布于 2009-07-06 01:55:26
将int转换为decimal是没有问题的,但是当您对一个对象进行拆箱时,您必须使用该对象所包含的确切类型。
要将整数值拆箱为小数值,首先将其作为decimal值拆箱,然后将其转换为decimal:
decimal d = (decimal)(int)reader[0];IDataRecord接口还提供了对值进行拆箱的方法:
decimal d = (decimal)reader.GetInt32(0);发布于 2015-12-29 04:59:42
这是一个简单的解决方案。它负责拆箱,然后转换为小数。对我来说工作得很好。
decimal d = Convert.ToDecimal(reader[0]); // reader[0] is inthttps://stackoverflow.com/questions/1085097
复制相似问题