【问题标题】:Why can't I cast an object-var of a long to a double?为什么我不能将 long 的 object-var 转换为 double?
【发布时间】:2015-04-27 17:52:07
【问题描述】:

我是 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。

【问题讨论】:

    标签: c# casting type-conversion


    【解决方案1】:

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

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

    第二个 sn-p 因您确定的原因起作用。

    【讨论】:

    • 我明白了,所以使用“object”作为变量类型会创建对值的引用。有没有办法将值拆箱为双精度,如果它是长的,则为长的?
    • @Jacque 如何计划存储任意未装箱的值?在var?请记住,var 是在编译时解析的。如果有这样一个表达式可以将一个对象拆箱为它自己的类型,那么这样一个表达式的类型会是什么?它不能成为对象,因为你最终会得到你开始的东西。如果您想访问实例内的数据,您可以 -不推荐- 使用 TypedReference。如果您想将此对象传递给同时采用doublelong 的方法重载,请将其用作dynamic
    • @JacqueGoupil 是的,但据我所知不是有用的方式。也许您需要泛型并摆脱拳击?
    • @harold 很好,我只是好奇。我现在只坚持使用 Convert.toDouble。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2021-12-03
      • 2014-08-31
      相关资源
      最近更新 更多