什么是包装转换?

Art*_*hez 10 c# casting

当您尝试将值从类型转换为另一种不兼容类型时,您在C#中收到以下错误:

CS0039无法通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换将类型A转换为B.

我理解如何解决这个问题,但我的问题是转换类型本身.它提到了引用(超类到子类,反之亦然),装箱和拆箱(值类型到对象)和null类型(例如int到int?)转换,但是什么是包装转换?这个对我来说并不明显,搜索这个术语只会带来有关错误CS0039的结果,而不是对概念的解释.

Jon*_*eet 13

环绕将非可空值类型转换为可为空的等效类型.解开是相反的.例如:

int x = 5;
int? y = x; // Wrapping
int z = (int) y; // Unwrapping
Run Code Online (Sandbox Code Playgroud)

C#规范实际上并没有调用这些"包装转换"和"解包转换",但它确实讨论了包装和解包.从C#5规范的4.1.10节或在线规范(强调我的):

假定为HasValuefalse 的实例为空.null实例具有未定义的值.尝试读取Valuenull实例会导致System.InvalidOperationException抛出a.访问Value可空实例的属性的过程称为展开.除了默认构造函数之外,每个可空类型T?都有一个公共构造函数,它接受一个类型的参数T.给定xtype 的值,T表单的构造函数调用

new T?(x)
Run Code Online (Sandbox Code Playgroud)

创造了一个非空的情况下T?为其Value财产x.为给定值创建可空类型的非null实例的过程称为包装.

  • @EricLippert:我打赌一些真的很模糊但是财富500强公司运行的非常重要的软件将会破坏你现在这样做因为它在文本上匹配......但是嘿,至少我们现在知道什么是什么.:-) (2认同)