.Net如何允许可空类型被设置为null?

4
Nullable<T> 类型被定义为一个结构体。在 .Net 中,你不能将 null 赋值给一个 struct,因为 structs 是值类型,不能用 null 表示(除了 Nullable<T>)。
int i = null; // won't compile - we all know this
int? i = null; // will compile, and I'm glad it does, and it should compile, but why?

Nullable<T>如何成为规则“您无法将null分配给值类型”的例外?反编译Nullable<T>的代码并没有提供任何关于这是如何发生的信息。


可能是重复的问题:在 .NET 中,可空类型是如何实现的? - Sriram Sakthivel
1个回答

14

Nullable<T>如何成为“无法将null分配给值类型”的规则的例外?

基本上是通过改变语言。 null字面量从“空引用”变成了“相关类型的null值”。

在执行时,可空值类型的“null值”是一个值,其中HasValue属性返回false。所以这个:

int? x = null;

等同于:

int? x = new int?();

值得把Nullable<T>框架部分与语言和CLR方面区分开来。实际上,CLR本身并不需要了解可空值类型的很多内容 - 据我所知,唯一重要的方面是可空值类型的null值被装箱为null引用,并且您可以将null引用取消装箱为任何可空值类型的null值。即使这也是在.NET 2.0正式发布之前才引入的。

语言支持主要包括:

  • 形式为?的语法糖,因此int?等效于Nullable<int>
  • 提升运算符
  • null的改变含义
  • 空合并运算符(??) - 不限于可空值类型

3
如果您需要更多详细信息,我在《深入 C#》一书中,专门撰写了一个完整章节关于可空值类型的内容 :) - Jon Skeet
@JonSkeet 那么让 int i = null; 等同于 int i = new int(); 需要做些什么呢? - Dan
@Dan:基本上需要一个新的C#编译器 :) - Jon Skeet
@SriramSakthivel:不需要将其设置为false,因为对于数组等类型来说,这是默认值,这对于类型内部的bool字段非常重要。 - Jon Skeet
@JonSkeet 是的,我已经知道了。如果当 i 已经有值时,我们用 null 覆盖它会怎样呢?那会将布尔值设置为 false 还是创建一个新的可空类型? - Sriram Sakthivel
显示剩余8条评论

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