【问题标题】:How Does .Net Allow Nullables To Be Set To Null.Net 如何允许将 Nullables 设置为 Null
【发布时间】:2013-09-07 05:55:58
【问题描述】:

Nullable<T> 类型定义为struct。在 .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> 的反编译代码没有提供关于这是如何发生的任何见解。

【问题讨论】:

标签: c# .net null clr nullable


【解决方案1】:

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

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

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

int? x = null;

相当于:

int? x = new int?();

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

语言支持主要包括:

  • ? 形式的语法糖,所以int? 等价于Nullable<int>
  • Lifted operators
  • null的含义改变
  • 空合并运算符 (??) - 不限于可为空的值类型

【讨论】:

  • @Dan:如果您想了解更多细节,我会用一整章的篇幅深入介绍 C# 中的可空值类型 :)
  • @JonSkeet 那么如何使int i = null; 等同于int i = new int();
  • 我想当我们设置 int i = null; 时,运行时只会将 HasValue 属性设置为 false,我说得对吗@Jon
  • @Dan:基本上需要一个新的 C# 编译器 :)
  • @SriramSakthivel:不需要设置为false;这是类型的默认值,这对于数组等很重要。基本上类型内部有一个bool 字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多