为什么值类型可以';不能为null

本文关键字:不能 null 类型 为什么 | 更新日期: 2023-09-27 18:00:44

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

为什么值类型可以';不能为null

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

值类型存储为值本身,没有任何引用
因此,使用null值类型—根据定义,值类型包含一个值。

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

像"Int32"这样的值类型使用32位存储。精确地说,有4294967296个值可以由32位表示,Int32可以保存429496729个不同的值。如果-2147483648不是有效的Int32值,则可以使用它来表示"null",但其二进制表示并非全为零这一事实会使事情变得复杂。相比之下,引用类型中可能的比特组合的数量远远超过可能的有效引用的数量,因此保留一个比特组合来表示"null"并不困难。