为什么以下操作被禁止?
Nullable<Nullable<int>>
然而
struct MyNullable <T>
{
}
MyNullable<Nullable<int>>
不是
为什么以下操作被禁止?
Nullable<Nullable<int>>
然而
struct MyNullable <T>
{
}
MyNullable<Nullable<int>>
不是
Nullable<int>
不是外部Nullable的有效类型参数。
这在约束文档中明确说明。<Nullable<null>>
和Nullable<null>
的方法,也没有明显的解决方案。Nullable<Nullable<int>> x = null;
Nullable<int> y = null;
Console.WriteLine(x == null); // true
Console.WriteLine(y == null); // true
Console.WriteLine(x == y); // false or a compile time error!
使该返回值为true将非常复杂,并且会在涉及Nullable类型的许多操作中产生显著的开销。
CLR中的某些类型是“特殊的”,例如字符串和基元,编译器和运行时都了解彼此使用的实现方式。 Nullable也以这种方式很特殊。由于它已经在其他领域被特殊处理,所以特殊处理where T:struct
方面并不是一件大事。其好处在于处理泛型类中的结构,因为除了Nullable之外,它们都不能与null进行比较。这意味着jit可以安全地认为t == null
始终为false。
当语言被设计为允许两个非常不同的概念相互作用时,您往往会遇到奇怪,令人困惑或非常危险的边缘情况。例如,考虑Nullable和等式运算符。
int? x = null;
int? y = null;
Console.WriteLine(x == y); // true
Console.WriteLine(x >= y); // false!
Nullable
中使用非空值类型。因为 Nullable
本身是可空的,所以不允许这样嵌套。
public Nullable( T value )
Type: T A value type.
Nullable是特殊的,因为CLR内置了对Nullable类型的装箱和拆箱的显式支持:
如果您针对Nullable<T>
使用MSIL box
指令,则实际上会得到一个null
作为结果。没有其他值类型在装箱时会产生null。
对于拆箱也有类似而对称的支持。
Nullable的通用类型参数本身必须是非空类型(即值类型)。这是我得到的C#编译器警告,似乎很有道理。告诉我,为什么你要这样做呢?我个人看不出有什么用处,甚至意义也不大。
Nullable 允许您将值类型转换为引用类型,就像引用类型一样,该值要么存在,要么不存在(为空)。由于引用类型已经是可空的,因此不允许使用。
引用自 MSDN:
Nullable(T) 结构支持仅使用值类型作为可空类型,因为引用类型在设计上就是可空的。