为什么CLR支持Nullable类型?

时间:2011-08-09 11:42:11

标签: c# clr

我听说在C#2.0中添加Nullable<T>类型需要稍微修改CLR(运行时),这是否需要更改?如果仅添加新的Nullable<T>泛型类,它可以实现相同的目标吗?

3 个答案:

答案 0 :(得分:2)

Nullable不是您指定的泛型类,Nullable<T>是通用的(它有一个类型参数,T)。这就是为什么Nullable<T>只是在C#2.0中出现的原因:它带来了对CLR的泛型。

你可以用一般Nullable做同样的事情,但是你做不到这样的事情:

int? myInt = 123;
int result = myInt.Value;

你必须:

int result = (int)myInt.Value;

...它可能不是类型安全的,我的意思是如果myInt.Valuestring会怎么样?通用版本Nullable<T>只允许int进入Value属性。

我并不完全明白你在问什么,但是......“为什么通用类会有用”?

答案 1 :(得分:1)

如果我理解正确,你会问为什么它不能只是框架库中引入的类型?但是需要改变CLR吗?

根据我的理解,Nullable是一种特殊类型,不像其他容器类型。首先,它实际上是一个值类型 - 定义为struct,而不是类。另外,它允许被赋值为null(对于值类型,这是一种特殊情况),并且它支持使用'?'和运营商'??'这是全新的。 Nullable也成为Common类型系统的一部分。所以我想从这些角度来看,需要更改规范,编译器和CLR。

答案 2 :(得分:0)

我知道Nullable&lt; T&gt;的特殊处理只有两个原因:

  1. 允许从null引用的类型对象引用Nullable&lt; T&gt; HasValue = false。
  2. 允许Nullable&lt; T&gt;其中HasValue为false,比较等于null。

坦率地说,认为让Nullable&lt; T&gt;成为更好。框与任何其他值类型一样,并将Nullable&lt; T&gt; .Empty定义为可以与之进行比较的值(对于那些可能想要与可能为null或可能保持值的变量进行比较的情况)。在我看来,Object.Equals没有理由报告“int?”等于null的等于“long?”这也等于null。第一个应该被视为一个空的int大小的盒子,后者应该被视为一个空的长尺寸盒子。