我有一个IDataRecord reader我从如下检索小数:
IDataRecord reader
decimal d = (decimal)reader[0];
由于某种原因,这将引发无效的强制转换异常,指出“指定的强制转换无效”。
当我这样做时,reader[0].GetType()它告诉我它是一个Int32。据我所知,这应该不是问题。
reader[0].GetType()
我已经通过这个片段进行了测试,效果很好。
int i = 3750; decimal d = (decimal)i;
这让我scratch不解,想知道为什么它无法将装在阅读器中的int装箱为小数。
有谁知道为什么会这样?我想念些什么吗?
您只能将值类型拆箱为其原始类型(以及该类型的可空版本)。
顺便说一句,这是有效的(只是您的两行版本的缩写):
object i = 4; decimal d = (decimal)(int)i; // works even w/o decimal as it's a widening conversion
出于此原因,请阅读Eric Lippert的博客条目:表示和身份
就我个人而言,我将通过转换语法完成的工作归类为四种不同类型的操作(它们都有不同的IL指令):
box
unbox
dynamic_cast<Type>
castclass
static_cast<Type>
op_XXX