为什么我不能将一个long-object变量转换为double?

时间:2015-04-27 17:52:08

标签: c# casting type-conversion

我是C#的新手(但我知道C ++,JavaScript和Java),而且我使用JSON.net将JSON文件解析为Dictionary<string, object>。现在我试图将一个被解析为long的值存储到一个double变量中。 (我查看了检查器,它说字典值的类型为object{long}。)

object obj = 123L;
double dbl = (double)obj;

这给了我一个InvalidCastException。我进行了一些实验,发现Convert.ToDouble(obj)工作得很好。我环顾四周,无法找到关于铸造和转换之间差异的任何信息。也:

var v = 123L;
double dbl = (double)v;

这完美无缺。我想那是因为在这种情况下,var在编译时变成了Int64。

2 个答案:

答案 0 :(得分:7)

因为那是unboxing conversion。要将装箱long投射到double,您可以先取消装箱,然后实际转换它,例如:(未经过测试)

object obj = 123L;
double dbl = (double)(long)obj;

第二个片段适用于您确定的原因。

答案 1 :(得分:2)

将对象强制转换为值类型时,取消装箱。取消装箱仅适用于值类型的类型。由于对象的类型很长,因此无法将其拆分为双倍。查看Convert课程:

double dbl = Convert.ToDouble(obj, null);