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 中时会隐式发生。
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
时才有效。如果原始值可能是 int
或 long
,那么作为 int
的拆箱也可能会失败。
将代码更改为有效代码的简单方法是不要尝试自己动手。 .NET Framework 已经有一种方法可以完全按照您的意愿执行操作:Convert.ToInt64
。所以只写
long i = Convert.ToInt64(o);
并让运行时担心任何内部需要的中间类型转换。
我们可以将 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 中时会隐式发生。
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
时才有效。如果原始值可能是 int
或 long
,那么作为 int
的拆箱也可能会失败。
将代码更改为有效代码的简单方法是不要尝试自己动手。 .NET Framework 已经有一种方法可以完全按照您的意愿执行操作:Convert.ToInt64
。所以只写
long i = Convert.ToInt64(o);
并让运行时担心任何内部需要的中间类型转换。