gpt4 book ai didi

c# - 为什么拆箱需要在 C# 中进行显式转换?

转载 作者:IT王子 更新时间:2023-10-29 04:40:25 24 4
gpt4 key购买 nike

装箱是将值类型转换为托管堆对象的过程,它是隐式的。拆箱是相反的过程,编译器需要显式转换。由于装箱存储数据类型,为什么拆箱不能使用它而不是要求显式转换?

class BoxUnBox
{
static void Main()
{
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing - Why is an explicit cast required?
}
}

最佳答案

您的问题与开箱操作无关。实际上它应该听起来像“我为什么要使用显式转换?”考虑以下示例:

int i = 123;
long l = i;
int j = (int)l; // OMG why??

答案很简单,您可以在 C# 规范中找到它 6.2 Explicit conversions :

The explicit conversions are conversions that cannot be proven to always succeed, conversions that are known to possibly lose information, and conversions across domains of types sufficiently different to merit explicit notation.

在上面的示例中,您可能丢失信息,因为long 可以保存不适合int 范围的值。但是当将 int 分配给 long 时,您永远不会丢失信息:

long l = i; // safe

在您的示例中,您需要显式转换,因为隐式转换无法证明总是成功object 类型的变量可以引用 几乎任何类型。字符串呢?

object o = i;  // implicit and always safe
o = "Now I have a machinegun ho-ho-ho"; // safe too
int j = o; // will not succeed if o is string

类比

对象变量就像一个黑盒子,您可以在其中放置任何东西 - 音乐 CD、笔、电话或香蕉。不仅是你,任何人都可以把东西放在那里。如果你早上最后放进黑盒子里的东西是香蕉,你晚上回来吃你从黑盒子里拿出来的东西吗?如果你一个人住,而且房间是封闭的,而且你的内存力非常好,那么......那么你可以。你会想知道为什么每个人在吃之前都会检查他们盒子里的东西。但如果你不是一个人住,或者房间没有关门,或者你可以忘记你 Handlebars 机放进盒子里只是一次……祝你胃口好

关于c# - 为什么拆箱需要在 C# 中进行显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42390546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com