8

我知道装箱和拆箱是关于铸造(真实类型到对象......对象到真实类型)。但我不明白 MSDN 对 Nullable 的看法。这是我不明白的文字:

当一个可为空的类型被装箱时,公共语言运行库会自动装箱 Nullable 对象的基础值,而不是 Nullable 对象本身。也就是说,如果 HasValue 属性为 true,则 Value 属性的内容被装箱。当可空类型的基础值被拆箱时,公共语言运行库会创建一个新的可空结构,该结构已初始化为基础值。来源

当您将对象更改为真实类型时,可以为空的真实类型变量将是对象的类型?我不明白?

4

3 回答 3

14

它的意思是,如果你这样做:

int? x = 5;
object y = x; // Boxing

你最终得到一个盒装的int,而不是盒装的Nullable<int>。同样,如果您这样做:

int? x = null; // Same as new Nullable<int>() - HasValue = false;
object y = x; // Boxing

然后 y 最终成为空引用。

于 2008-12-17T14:59:14.020 回答
8

这意味着如果你这样做:

int? i = 5;
object o = i;

它是一个装箱的“int”(5),而不是“int?” (5)。如果 x 为 null (!HasValue),则 o 将为 null,而不是围绕空“int?”的框。

然后当你拆箱时:

i = (int?)o;

如果 o 为 null,则 i 变为空的“int?”;否则,将 5 拆箱并用于创建“新 int?(5)”。

基本上,您不应该(除了作弊)能够nullable<T>直接获得盒装 - 只有盒装T

于 2008-12-17T15:00:05.580 回答
3

如果 aNullable<T>null,它将被装箱为空引用,并且不会表现为带有 的装箱值类型HasValue = true

事实上,为了实现这个特性,需要 CLR 本质上支持Nullable<T>类型并区别对待它。开发人员无法编写自己的类型,就像Nullable<T>.

值得注意的是,这是 .NET 2.0 后期的功能之一。在早期的测试版中,Nullable<T>表现得就像一个正常的结构。在最终版本中,它被更改为 box to null 引用。这种变化对 SQL Server CLR 团队来说特别重要,他们不得不为此改变一些基本的东西。

于 2008-12-17T15:08:15.080 回答