为什么我不能写Nullable <Nullable <int >>?

Naw*_*waz 11 c# nullable value-type

定义Nullable<T>是:

[SerializableAttribute]
public struct Nullable<T> where T : struct, new()
Run Code Online (Sandbox Code Playgroud)

约束where T : struct意味着T只能是值类型.所以我很清楚我不能写:

Nullable<string> a; //error. makes sense to me
Run Code Online (Sandbox Code Playgroud)

因为string是引用类型,而不是值类型.但我真的不明白为什么我不能写

Nullable<Nullable<int>> b; //error. but why?
Run Code Online (Sandbox Code Playgroud)

为什么不允许?毕竟,Nullable<int>是一个值类型,因此,它可以是类型参数Nullablle<T>.

当我在ideone上编译它时,它会给出这个错误(ideone):

错误CS0453:类型'int?' 必须是非可空值类型才能在泛型类型或方法'System.Nullable'中将其用作类型参数'T'编译失败:1个错误,0个警告

the*_*oop 10

因为它在C#规范中(第4.4.4节):

如果约束是值类型约束(struct),则类型A必须满足以下条件之一:

  • A是结构类型或枚举类型,但不是可空类型.请注意,System.ValueType和System.Enum是不满足此约束的引用类型.
  • A是具有值类型约束(第10.1.5节)的类型参数.


Gab*_*abe 6

从C#语言规范的4.1.10节:

非空值类型相反地比其它任何类型的值System.Nullable<T>和其简写T?(对于任何T),加上被约束为一个非空值类型的任何类型的参数(即,与任何类型的参数struct约束).的System.Nullable<T>类型指定值类型约束T(§10.1.5),这意味着基础类型为null的类型可以是任何非空值类型.可空类型的基础类型不能是可空类型或引用类型.例如,int??并且string?是无效类型.