为什么我不能将 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);
我是 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);