当您尝试将值从一种类型转换为另一种不兼容的类型时,您会在 C# 中收到以下错误:
CS0039 无法通过引用转换、装箱转换、拆箱转换、包装转换或 null 类型转换将类型 A 转换为 B
我了解如何潜在地解决此问题,但我的问题是关于转换本身的类型。它提到了引用(超类到子类,反之亦然)、装箱和拆箱(值类型到对象)和 null 类型(例如 int 到 int?)转换,但是什么是包装转换?这对我来说并不明显,搜索该术语只会返回有关错误 CS0039 的结果,而不是对该概念的解释。
包装将不可为 null 的值类型转换为其可空的等效类型。展开则相反。例如:
int x = 5;
int? y = x; // Wrapping
int z = (int) y; // Unwrapping
C# 规范实际上并未将这些称为“包装转换”和“展开转换”,但它确实讨论了包装和展开。来自 C# 5 规范的第 4.1.10 节,或在线规格 https://learn.microsoft.com/en-gb/dotnet/csharp/language-reference/language-specification/types#nullable-types(强调我的):
一个实例HasValue
为 false 则表示为 null。 null 实例具有未定义的值。尝试阅读Value
空实例的结果会导致System.InvalidOperationException
被扔掉。访问的过程Value
可空实例的属性称为展开。
除了默认构造函数之外,每个可空类型T?
有一个公共构造函数,它接受单个类型的参数T
。给定一个值x
类型的T
,表单的构造函数调用
new T?(x)
创建一个非空实例T?
为此Value
财产是x
。为给定值创建可空类型的非空实例的过程称为wrapping.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)