C#长数据类型拆箱问题

Ind*_*nil 1 c# c#-4.0

我们可以投intlong.
为什么下面的代码会产生运行时错误.

object o = 9;
long i = (long)o;
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)

我是C#的新手.

Cha*_*ger 5

根据这一点文档

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

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

object o = 9;
long i = (int)o;
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

long i = Convert.ToInt64(o);
Run Code Online (Sandbox Code Playgroud)

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