为什么值类型不能为null

时间:2011-06-29 13:05:50

标签: c# .net null clr value-type

我知道可以使用Nullable值类型来包装值类型并提供存储null的能力。 但有技术原因是不允许值类型为null或原因只是概念性的吗?

2 个答案:

答案 0 :(得分:36)

引用类型存储为对象实例的引用(如指针) null表示未指向对象实例的引用。

值类型存储为值本身,没有任何引用 因此,拥有null值类型没有意义 - 值类型按定义包含值。

Nullable<T>是一个带有HasValue标志的值类型,可以false表示没有值。它仍有一个值(当HasValuefalse时,Valuedefault(T)),但HasValue标志会告诉您忽略该值。
它与null无关,只是CLR会自动将null装箱值取消装箱,将Nullable<T>设置为HasValue {/ 1}}。

答案 1 :(得分:1)

使用32位存储空间存储类似'Int32'的值类型。精确地有4,294,967,296个值可以用32位表示,Int32可以包含4,294,967,296个不同的值。如果-2,147,483,648不是有效的Int32值,则可能使用它来表示“null”,但其二进制表示不是全零的事实会使事情复杂化。相比之下,引用类型中可能的位组合数远远超过可能的有效引用数,因此保留位组合来表示“null”没有困难。