我知道可以使用Nullable值类型来包装值类型并提供存储null的能力。 但有技术原因是不允许值类型为null或原因只是概念性的吗?
答案 0 :(得分:36)
引用类型存储为对象实例的引用(如指针)
null
表示未指向对象实例的引用。
值类型存储为值本身,没有任何引用
因此,拥有null
值类型没有意义 - 值类型按定义包含值。
Nullable<T>
是一个带有HasValue
标志的值类型,可以false
表示没有值。它仍有一个值(当HasValue
为false
时,Value
为default(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”没有困难。