C# 长数据类型拆箱问题

C# long data type unboxing issue

我们可以将 int 转换为 long
为什么下面这段代码给出了运行时间错误。

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

我是 C# 新手。

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

因此您需要先将对象转换为它的实际类型 (int),然后才能执行 conversion 到 long:

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

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

根据 this bit of documentation:

For the unboxing of value types to succeed at run time, the item being unboxed must be a reference to an object that was previously created by boxing an instance of that value type. Attempting to unbox null or a reference to an incompatible value type will result in an InvalidCastException.

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

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

现有的答案正确地解释了为什么会出现异常,但并没有真正说明您可以做什么。首先转换为 int 是典型的答案,但只有当您知道原始值是 int 时才有效。如果原始值可能是 intlong,那么作为 int 的拆箱也可能会失败。

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

long i = Convert.ToInt64(o);

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