可空的限制

srv*_*v52 7 c#

有谁知道为什么这段代码不能编译?

Nullable<Nullable<int>> n = null;
Run Code Online (Sandbox Code Playgroud)

我意识到Nullable有一个约束

where T : struct
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ter 6

错误消息是:

该类型int?必须是非可空值类型,以便在泛型类型或方法中将其用作参数"T"Nullable<T>

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

这是编译器错误CS0453,它也显示了这个例子:

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

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

是的,这意味着知道他们如何实现这一约束并不是很有趣.这是编译器的实现细节,不需要使用C#语言功能.


为什么不允许?

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

  • 关于这种行为是如何实际实现的任何想法?我不知道对非可空类型的任何约束(或者我还不知道它们) (2认同)