2014-06-24 14 views
5

最近在修改一个概念时,我遇到了一个有趣的情况,我想知道为什么会发生这种情况。.Net编程语言中的可为空类型

我们知道一个概念,我们不能赋予null值的值类型,即StructintDateTime

为了分配null我们需要可空类型,即

int i应及时更换与Nullable<int> i = null

但是如果我们看到Nullable<T>它也是struct类型,然后怎么来null可以不统计分配有任何错误?为什么微软反驳它自己的声明“空不能赋值类型”

如果有人知道背后的原因?

+2

你的编译器知道可为空值的类型是什么样的。它不*实际*分配* null *。使用ildasm.exe查看它的功能。 –

回答

20

因为Nullable<T>有编译器级支持; nullNullable<T>的上下文中本质上是具有HasValue标志false的值,其中 - 作为非空值具有trueHasValue标志。同样,“提升”的运营商也是来自所定义的运营商。同样,Nullable<T>CLI支持,在拳击方面:盒装Nullable<T>HasValuefalse变成null,而不是一个新的盒子实例。

基本上:这一切都归结为,因为这是他们如何定义它应该工作

人们希望可以为空的值类型:微软想出了一个办法来实现这种功能。

+0

它需要“编译器级支持吗?”我假设它可以通过覆盖标准结构的等号运算符/方法来实现(尽管有一些编译器优化是完全可能的......)。 (我承认我没有看过IL /代码的'Nullable',可能应该!) –

+0

@DanPuzey是的,它的确如此;否则诸如'== null' /'!= null',或任何算术运算符等都不起作用。例如,一个常规的结构不会为空。 –