可空的限制

时间:2017-09-06 12:55:07

标签: c#

有谁知道为什么这段代码无法编译?

Nullable<Nullable<int>> n = null;

我意识到Nullable有一个约束

where T : struct

但Nullable是结构。我也知道这个约束有一个限制“类型参数必须是一个值类型。可以指定除Nullable之外的任何值类型。” (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters)。 那么它是怎样工作的?这是在编译器级别解决的吗?

1 个答案:

答案 0 :(得分:6)

错误消息是:

  

类型int?必须是不可为空的值类型才能使用它   作为参数&#39; T&#39;在通用类型或方法Nullable<T>

因此,它不仅必须是值类型,还必须是不可为空的值类型。但Nullable<int>是可以为空的值类型。

这里的compiler error CS0453也显示了这个例子:

  

使用非值类型参数时会发生此错误   实例化具有值约束的泛型类型或方法   在上面。 当您使用可为空的值类型参数时也会发生这种情况。

问:这是在编译器级别解决的吗?

是的,这意味着它&#39;知道他们如何实现这种约束并不是很有趣。它是编译器的一个实现细节,不需要使用C#语言特性。

  

为什么不允许?

那么,Nullable<Nulable<int>>会带来什么好处?引入了Nullables,为值类型提供了null的机会(所以未定义,没有价值)。这已经针对Nullable<int>实现,可以是null。因此,通过将其嵌套在另一个可空的内容中,您将无法获得任何结果。不允许出于同样的原因,为什么您不能拥有Nullable<string>字符串,因为其他所有引用类型都必须为null