C#长数据类型拆箱问题

时间:2015-06-14 15:42:11

标签: c# c#-4.0

我们可以将int投射到long 为什么下面的代码会产生运行时错误。

object o = 9;
long i = (long)o;
Console.WriteLine(i);

我是C#的新手。

3 个答案:

答案 0 :(得分:5)

现有的答案正确地解释了为什么你会得到一个例外,但并没有真正展示你可以做什么。首次投射到int是典型的答案,但只有在您知道原始值为int时才有效。如果原始值可以是intlong,则取消装箱为int也可能会失败。

将代码更改为有效的方法的简单方法是不要自己尝试。 .NET Framework已经有一种方法可以完全按照您的要求执行:Convert.ToInt64。所以写一下

long i = Convert.ToInt64(o);

让运行时担心任何内部需要的中间类型转换。

答案 1 :(得分:3)

this bit of documentation

  

要使值类型的取消装箱在运行时成功,要取消装箱的项目必须是对先前通过装箱该值类型的实例创建的对象的引用。尝试取消设置null或引用不兼容的值类型将导致InvalidCastException。

因此,您必须先取消装箱到int,然后转换为long(存在隐式转换):

object o = 9;
long i = (int)o;

答案 2 :(得分:1)

由于int和long都是值类型,因此它们按值复制,而不是像引用类型(例如object)那样通过引用复制。所以o是引用类型,因此int对象通过引用存储。为了将它放在值类型的新变量中,您需要具有一些可以实际复制到其中的值。

因此,在将转换类型转换为long之前,需要先将对象强制转换为实际类型(int):

object o = 9;
long i = (long)(int)o;

您不一定需要执行(long),因为在将值存储在long中时会发生隐含的情况。