我听说在C#2.0中添加Nullable<T>
类型需要稍微修改CLR(运行时),这是否需要更改?如果仅添加新的Nullable<T>
泛型类,它可以实现相同的目标吗?
答案 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.Value
是string
会怎么样?通用版本Nullable<T>
只允许int
进入Value
属性。
我并不完全明白你在问什么,但是......“为什么通用类会有用”?
答案 1 :(得分:1)
如果我理解正确,你会问为什么它不能只是框架库中引入的类型?但是需要改变CLR吗?
根据我的理解,Nullable是一种特殊类型,不像其他容器类型。首先,它实际上是一个值类型 - 定义为struct,而不是类。另外,它允许被赋值为null(对于值类型,这是一种特殊情况),并且它支持使用'?'和运营商'??'这是全新的。 Nullable也成为Common类型系统的一部分。所以我想从这些角度来看,需要更改规范,编译器和CLR。
答案 2 :(得分:0)
我知道Nullable&lt; T&gt;的特殊处理只有两个原因:
坦率地说,认为让Nullable&lt; T&gt;成为更好。框与任何其他值类型一样,并将Nullable&lt; T&gt; .Empty定义为可以与之进行比较的值(对于那些可能想要与可能为null或可能保持值的变量进行比较的情况)。在我看来,Object.Equals没有理由报告“int?”等于null的等于“long?”这也等于null。第一个应该被视为一个空的int大小的盒子,后者应该被视为一个空的长尺寸盒子。