为什么值类型不能为null?

18
我知道可以使用可空值类型来包装值类型并使其能够存储 null 值。 但是,为什么不允许值类型为 null?这是技术上的原因还是概念上的原因?
2个回答

37

引用类型被存储为对对象实例的引用(类似于指针)。
null表示一个未指向任何对象实例的引用。

值类型被存储为值本身,没有任何引用。
因此,没有意义将值类型设为null——按照定义,值类型包含一个值。

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


我们可以使用 ? 运算符使变量可为空。例如,int? x = null; - Shekhar
3
他意识到了。这与“null”无关。 - SLaks

1
一个像'Int32'这样的值类型使用32位存储。32位可以表示确切地4,294,967,296个值,而Int32可以容纳4,294,967,296个不同的值。如果-2,147,483,648不是有效的Int32值,可能会用它来表示"null",但是它的二进制表示不全为零会使事情复杂化。相比之下,引用类型中可能的位组合数量远远超过可能的有效引用数量,因此没有困难保留一种位组合来表示"null"。

你有什么参考资料(文章)可以解释一下吗?我还不太清楚你所提出的想法。 - Marshal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接