为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能将int开箱为小数?

为什么我不能将int开箱为小数?

C#
开心每一天1111 2019-09-24 15:06:40
我有一个IDataRecord reader我从如下检索小数:decimal d = (decimal)reader[0];由于某种原因,这将引发无效的强制转换异常,指出“指定的强制转换无效”。当我这样做时,reader[0].GetType()它告诉我它是一个Int32。据我所知,这应该不是问题。我已经通过这个片段进行了测试,效果很好。int i = 3750;decimal d = (decimal)i;这让我scratch不解,想知道为什么它无法将装在阅读器中的int装箱为小数。有谁知道为什么会这样?我想念些什么吗?
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

您只能将值类型拆箱为其原始类型(以及该类型的可空版本)。


顺便说一句,这是有效的(只是您的两行版本的缩写):


object i = 4;

decimal d = (decimal)(int)i; // works even w/o decimal as it's a widening conversion

出于此原因,请阅读Eric Lippert的博客条目:表示和身份


就我个人而言,我将通过转换语法完成的工作归类为四种不同类型的操作(它们都有不同的IL指令):


装箱(boxIL指令)和拆箱(unboxIL指令)

通过继承层次结构进行转换(如dynamic_cast<Type>C ++中一样,使用castclassIL指令进行验证)

基本类型之间的转换(像static_cast<Type>在C ++中一样,对于基本类型之间的不同类型的转换,有很多IL指令)

调用用户定义的转换运算符(在IL级别,它们只是对适当op_XXX方法的方法调用)。


查看完整回答
反对 回复 2019-09-24
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

转换为intto 没问题decimal,但是当您将一个对象拆箱时,您必须使用该对象包含的确切类型。


要将int值拆箱为decimal值,请先将其拆为int型,然后将其强制转换为十进制:


decimal d = (decimal)(int)reader[0];

IDataRecord接口还具有将值拆箱的方法:


decimal d = (decimal)reader.GetInt32(0);


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 399 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信