C# 什么是包装转换?

C# 什么是包装转换?,c#,casting,C#,Casting,当您尝试将值从一个类型强制转换为另一个不兼容的类型时,在C#中会出现以下错误: CS0039无法通过引用转换、装箱转换、取消装箱转换、换行转换或空类型转换将类型A转换为B 我知道如何潜在地解决这个问题,但我的问题是转换类型本身。它提到了引用(超类到子类,反之亦然)、装箱和拆箱(值类型到对象)以及空类型(例如int到int?)转换,但什么是包装转换?这个对我来说并不明显,搜索这个术语只会返回错误CS0039的结果,而不是对概念的解释。包装将不可为null的值类型转换为其可为null的等效值。拆开包

当您尝试将值从一个类型强制转换为另一个不兼容的类型时,在C#中会出现以下错误:

CS0039无法通过引用转换、装箱转换、取消装箱转换、换行转换或空类型转换将类型A转换为B


我知道如何潜在地解决这个问题,但我的问题是转换类型本身。它提到了引用(超类到子类,反之亦然)、装箱和拆箱(值类型到对象)以及空类型(例如int到int?)转换,但什么是包装转换?这个对我来说并不明显,搜索这个术语只会返回错误CS0039的结果,而不是对概念的解释。

包装将不可为null的值类型转换为其可为null的等效值。拆开包装则相反。例如:

int x = 5;
int? y = x; // Wrapping
int z = (int) y; // Unwrapping
C#规范实际上并没有称这些为“包装转换”和“展开转换”,但它确实谈到了包装和展开。根据C#5规范第4.1.10节或(重点矿山):

HasValue
为false的实例称为null。空实例具有未定义的值。试图读取空实例的
会导致抛出
System.InvalidOperationException
。访问可空实例的
属性的过程称为展开。 除了默认构造函数外,每个可为null的类型
T?
都有一个公共构造函数,它接受一个
T
类型的参数。给定类型为
T
的值
x
,则

new T?(x)
创建
T?
的非空实例,其
Value
属性为
x
。为给定值创建可为null类型的非null实例的过程称为包装

如下列文件所述:

如果可空转换是从
S
T?
,则转换为 评估为从
S
T
的基础转换,然后是 从
T
包装到
T?


这意味着包装意味着将一个不可为null的变量转换为它的可为null的类型变量。

@Alex:这只是一个用户定义的转换运算符,不能与
as
一起使用。这里提到了这一点。为了补充这一点,阿图罗错误地认为这是»空类型转换«,我认为这是指将
null
literal转换为任何兼容类型。@Jeroenmoster:谢谢,刚才也添加了引号。将添加一个链接。。。尽管这是目前的C#6规范草案,但URL表明它将始终是“最新的”。@jeroenmoster:spec中曾经有“null类型”,但Mads和我删除了它,因为它是不必要的。显然,当我们更新错误信息时,我忘了更新错误信息。@EricLippert:我敢打赌,如果你现在更新,财富500强公司运行的一些非常模糊但极其重要的软件将会崩溃,因为它与文本匹配。。。但是,嘿,至少我们现在知道是什么了。:-)