首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可空限制

可空限制
EN

Stack Overflow用户
提问于 2017-09-06 12:55:07
回答 1查看 174关注 0票数 7

有人知道为什么这段代码不编译吗?

代码语言:javascript
运行
复制
Nullable<Nullable<int>> n = null;

我意识到Nullable有一个约束

代码语言:javascript
运行
复制
where T : struct

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46075839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档