我是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。
答案 0 :(得分:7)
因为那是unboxing conversion。要将装箱long
投射到double
,您可以先取消装箱,然后实际转换它,例如:(未经过测试)
object obj = 123L;
double dbl = (double)(long)obj;
第二个片段适用于您确定的原因。
答案 1 :(得分:2)
将对象强制转换为值类型时,取消装箱。取消装箱仅适用于值类型的类型。由于对象的类型很长,因此无法将其拆分为双倍。查看Convert课程:
double dbl = Convert.ToDouble(obj, null);