2015-06-14 70 views
1

我们可以将int转换为long
为什么下面这段代码给出了运行时错误。C#长数据类型拆箱问题

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

我是C#的新手。

+0

什么错误和在哪里? – Alejandro

+0

它给了我InvalidCastException – Indranil

+0

'o'是一个盒装的int,所以你在铸造之前首先必须解开底层的值类型,然后才能将'(long)(int)o' – chomba

回答

3

this bit of documentation

对于值类型的开箱在运行时成功,的项目是装箱必须是先前由拳击该值类型的实例创建一个对象的引用。尝试解除空箱或对不兼容的值类型的引用将导致InvalidCastException。

所以,你必须拆箱到int,然后再转换为long(隐式转换存在):

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

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

所以你需要将对象转换为实际类型(INT)第一,然后才能执行一种类型转换长:

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

你不一定需要做(long)但正如在long中存储值时会隐式发生。

+1

或者你可以声明为: 'object o = 9L'。哪一个会明确地将'object'声明为'long' –

5

现有的答案正确地解释为什么你会得到一个例外,但真的不显示你可以做什么。首先铸造到int是典型的答案,但只有当您知道原始值是int时才有效。如果原始值可能是intlong,那么拆箱作为int也可能会失败。

将代码更改为有效的简单方法是不要试图自己动手。 .NET Framework已经有一种方法可以完成你想要的功能:Convert.ToInt64。所以只写

long i = Convert.ToInt64(o); 

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