有谁知道为什么这段代码无法编译?
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)。 那么它是怎样工作的?这是在编译器级别解决的吗?
答案 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
。