当您尝试将某个值从某个类型转换为另一个不兼容的类型时,您会在C#中收到以下错误:
CS0039无法通过引用转换,装箱转换,取消装箱转换,换行转换或空类型转换将A类型转换为B
我理解如何解决这个问题,但我的问题是关于转化类型本身。它提到了引用(超类到子类,反之亦然),装箱和拆箱(值类型到对象)和null类型(例如int到int?)转换,但是什么是包装转换?这个对我来说并不明显,搜索这个术语只会带来有关错误CS0039的结果,而不是对概念的解释。
答案 0 :(得分:13)
Wrapping将非可空值类型转换为可为空的等价物。解开是相反的。例如:
int x = 5;
int? y = x; // Wrapping
int z = (int) y; // Unwrapping
C#规范实际上并没有调用这些“包装转换”和“解包转换”,但它确实讨论了包装和解包。从C#5规范的4.1.10节,或online spec(强调我的):
HasValue
为false的实例被称为null。 null实例具有未定义的值。尝试读取空实例的Value
会导致抛出System.InvalidOperationException
。访问可空实例的Value
属性的过程称为展开。 除了默认构造函数之外,每个可空类型T?
都有一个公共构造函数,它接受类型为T
的单个参数。给定类型x
的值T
,构造函数调用new T?(x)
创建
T?
属性为Value
的{{1}}非空实例。为给定值创建可空类型的非null实例的过程称为包装。
答案 1 :(得分:3)