有人知道为什么这段代码不编译吗?
Nullable<Nullable<int>> n = null;我意识到Nullable有一个约束
where T : struct但Nullable是结构化的。我还知道这个约束有一个限制:“type参数必须是值类型。除Nullable以外的任何值类型都可以指定。”(https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters)。那么它是如何工作的呢?这在编译器级别解决了吗?
发布于 2017-09-06 13:00:16
错误信息是:
类型
int?必须是非空值类型,才能将其用作泛型类型或方法Nullable<T>中的参数'T‘。
因此,它不仅必须是值类型,而且必须是非空值类型。但是Nullable<int>是一个可空的值类型。
下面是编译器错误CS0453,它也显示了这个示例:
使用非值类型参数实例化具有value约束的泛型类型或方法时,会发生此错误。也可以在使用可空值类型参数时发生。
问:这是在编译器级别上解决的吗?
是的,这意味着知道他们是如何达到这个约束的,这不是很有趣。这是编译器的实现细节,不需要使用C#语言特性。
为什么不允许?
那么,Nullable<Nulable<int>>的好处是什么呢?引入Nullables是为了让值类型有机会成为null(所以没有定义,没有值)。这对于Nullable<int>来说已经实现了,它可以是null。所以,把它嵌套在另一个可空的地方,你就什么也得不到了。这是不允许的,因为为什么您不能拥有一个Nullable<string>,一个字符串,因为所有其他引用类型都可以是null。
https://stackoverflow.com/questions/46075839
复制相似问题