2008-12-17 76 views
6

我明白,拳击和拆箱是关于铸造(真正的类型对象...对象到实际类型)。但我不明白MSDN对Nullable的看法。以下是我不明白的文本:拳击/取消装箱和可空?

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

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

+0

伟大的思想思考。 (比较@Jon和@Marc) – harpo 2008-12-17 15:02:34

+2

伟大的头脑需要从这里度过假期:) – mackenir 2008-12-17 15:08:23

回答

10

那是什么要说的是,如果你这样做:

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结束为空引用。

+4

哈哈!纯粹的巧合,但在第二种情况下可怕的无效 – 2008-12-17 19:50:22

8

这也就意味着,如果你做:

int? i = 5; 
object o = i; 

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

然后,当你拆箱:

i = (int?)o; 

如果o是空的,我变成一个空; “INT?”否则,5将被拆箱并用于创建“new int?(5)”。

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

3

如果Nullable<T>null,它会被装箱为空引用,也不会表现为与HasValue = true的盒装值类型。

实际上,要实现此功能,需要CLR本质上支持Nullable<T>类型并以不同的方式对待它。开发人员不能编写自己的类型,其工作方式类似于Nullable<T>

值得注意的是,这是.NET 2.0的后期功能之一。在早期的贝塔,Nullable<T>表现得像一个正常的结构。在最终版本中,它被更改为空框引用。这一变化特别突破了SQL Server CLR团队,他们不得不为其改变一些基本的东西。