什么是换行转换?

时间:2018-02-27 16:19:03

标签: c# casting

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

  

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

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

2 个答案:

答案 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)

the spec中所述:

  

如果可空转换是从ST?,则转换为。{   评估为从ST 的基础转换,后跟a   从T包裹到T?

隐含意味着换行意味着将不可为空的内容变为可空的类型变体。