为什么我不能将 long 对象变量转换为 double?

Why can't I cast an object-var of a long to a double?

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

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

这给了我 InvalidCastException。我做了一些实验,发现 Convert.ToDouble(obj) 效果很好。我环顾四周,找不到关于转换和转换之间的区别的任何信息。还有:

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

这非常有效。我想那是因为在这种情况下,var 在编译时变成了 Int64。

因为那是 unboxing conversion。为了将装箱的 long 转换为 double,您可以先将其拆箱,然后再进行实际转换,例如:(未测试)

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

第二个片段符合您确定的原因。

当您将对象转换为值类型时,您拆箱它。拆箱只能对值类型的类型进行。由于对象的类型很长,您不能将其拆箱加倍。检查 Convert class:

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