4

类型定义Nullable<T>为. struct在 .Net 中,您不能分配null给 astruct因为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>没有提供关于这是如何发生的任何见解。

4

1 回答 1

14

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

通过改变语言,基本上。null文字从“空引用”变为“相关类型的空值” 。

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

int? x = null;

相当于:

int? x = new int?();

值得将框架部分Nullable<T>与语言和 CLR 方面分开。事实上,CLR 本身并不需要对可空值类型了解太多——据我所知,唯一重要的方面是可空值类型的空值被装箱到空引用,并且您可以拆箱对任何可为空值类型的空值的空引用。即使是在 .NET 2.0 的最终版本之前才引入。

语言支持主要包括:

  • ?so形式的语法糖int?等价于Nullable<int>
  • 提升运营商
  • 改变的意义null
  • 空合并运算符 ( ??) - 不限于可空值类型
于 2013-09-03T21:26:19.437 回答