我正在使用Sharepoint中的一小段代码,就像这样:
int? do_ = (int?)re["mi"]; // consider "re" a dictionary<string, object>;
等号右边的表达式计算为Double
。为了使double
确定,double
- 在观察窗口中检查了它(:D)。是的,它是System.Double
,进出。
然而,该行抛出异常:
指定的演员表无效。
我正准备用我的额头在我的桌子上留下一个凹痕,当它突然出现在我身上时,你可以将double转换为int,尽管丢失了值的非整数部分(实际上是在我的情况下) 。在世界开始之前,我在编程的第一天就学到了这一点。
因此,为了更加确定,我创建了另一个解决方案,一个简单的控制台应用程序。我把这段代码放进去了:
double dragon = 2.0;
int? i = (int?)dragon;
它的工作原理与预期一样。
为什么它会在一个设置中工作但在另一个设置中失败?
答案 0 :(得分:9)
这是一个非常常见的问题。您无法将装箱T
取消装箱至T
或T?
以外的任何其他内容。
我在这里解释原因:
http://ericlippert.com/2009/03/03/representation-and-identity/
答案 1 :(得分:2)
但这应该对你有用
(int?)(double)re["mi"];
<强> EDIT1 强>
如果盒装类型是双倍的话,上面的代码将起作用,如果是double?
则不起作用
使它工作做以下
(int?)(double?)re["mi"];
答案 2 :(得分:0)
这是因为您尝试将对象转换为整数。您的小数值已装箱。
Conciser this:
object o = 2.0d;
int i = (int)((double) o); // This will work