首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能将int拆箱为小数?

问为什么我不能将int拆箱为小数?
EN

Stack Overflow用户
提问于 2009-07-06 01:49:19
回答 4查看 24.2K关注 0票数 63

我有一个从其中检索小数的IDataRecord reader,如下所示:

代码语言:javascript
复制
decimal d = (decimal)reader[0];

由于某种原因,这会抛出一个无效的强制转换异常,说明“指定的强制转换无效”。

当我执行reader[0].GetType()时,它会告诉我这是一个Int32。据我所知,这应该不是问题……

我已经通过这个代码片段测试了这一点,它工作得很好。

代码语言:javascript
复制
int i = 3750;
decimal d = (decimal)i;

这让我摸不着头脑,想知道为什么它不能将阅读器中包含的int拆开为小数。

有人知道为什么会发生这种情况吗?我是不是漏掉了什么微妙的东西?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-06 01:52:49

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

顺便说一下,这是有效的(这只是您的两行版本的速记):

代码语言:javascript
复制
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指令):

  1. 装箱(box IL指令)和拆箱(通过继承层次结构的unbox IL指令(像C++中的dynamic_cast<Type>一样,使用castclass IL指令在基元类型之间进行转换(就像C++中的static_cast<Type>一样,对于基元类型之间的不同类型的转换有大量的IL指令(在IL级别上,它们只是对适当op_XXX方法的方法调用)。
票数 83
EN

Stack Overflow用户

发布于 2009-07-06 01:55:26

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

要将整数值拆箱为小数值,首先将其作为decimal值拆箱,然后将其转换为decimal:

代码语言:javascript
复制
decimal d = (decimal)(int)reader[0];

IDataRecord接口还提供了对值进行拆箱的方法:

代码语言:javascript
复制
decimal d = (decimal)reader.GetInt32(0);
票数 15
EN

Stack Overflow用户

发布于 2015-12-29 04:59:42

这是一个简单的解决方案。它负责拆箱,然后转换为小数。对我来说工作得很好。

代码语言:javascript
复制
decimal d = Convert.ToDecimal(reader[0]);  // reader[0] is int
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1085097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档