首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Nullable<T>混淆

Nullable<T>混淆
EN

Stack Overflow用户
提问于 2009-03-01 17:07:19
回答 5查看 3.3K关注 0票数 10

为什么以下内容是被禁止的?

代码语言:javascript
代码运行次数:0
运行
复制
Nullable<Nullable<int>>

鉴于

代码语言:javascript
代码运行次数:0
运行
复制
struct MyNullable <T>
{


}

MyNullable<Nullable<int>> 

不是

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-01 17:19:06

这是因为结构约束实际上意味着空,因为'not nullable'尽管是一个结构,但也是可以为空的(可以接受值为null)。对于外部可为空的,Nullable<int>不是一个有效的类型参数。

这在the constraints documentation中是显式的

结构,其中T:

类型参数必须是值类型。可以指定除Nullable之外的任何值类型。

有关更多信息,请参见使用可空类型(C#编程指南)。

如果你想知道它的原理,你需要实际的语言设计者对它的评论,但我找不到。然而,我会假设:

  1. 在当前版本中实现Nullable所需的编译器和平台更改相当广泛(并且是2.0版本中相对最新的补充)。

  1. ,他们有几个潜在的令人困惑的边缘情况。

允许int的等价物??这只会混淆这一点,因为该语言没有提供区分可空<Nullable<null>>和可空<null>的方法,也没有任何明显的解决方案来解决以下问题。

代码语言:javascript
代码运行次数:0
运行
复制
Nullable<Nullable<int>> x = null;
Nullable<int> y = null;
Console.WriteLine(x == null); // true
Console.WriteLine(y == null); // true
Console.WriteLine(x == y); // false or a compile time error!

要使该返回值为真,对于涉及类型的许多操作来说,这将是非常复杂和显著的开销。

CLR中的一些类型是“特殊的”,例如字符串和原语,因为编译器和运行时对彼此使用的实现了解很多。Nullable在这方面也很特别。由于它已经在其他领域有了特殊的用例,所以where T : struct方面并不是什么大问题。这样做的好处是在泛型类中处理结构,因为除了Nullable之外,没有一个可以与null进行比较。这意味着jit可以安全地认为t == null总是为false。

当语言被设计成允许两个非常不同的概念相互作用时,你往往会变得奇怪、困惑或危险的边缘情况。例如,考虑Nullable和相等运算符

代码语言:javascript
代码运行次数:0
运行
复制
int? x = null;
int? y = null;
Console.WriteLine(x == y); // true
Console.WriteLine(x >= y); // false!     

通过在使用struct泛型约束时防止Nullable,可以避免许多令人讨厌的(和不清楚的)边缘情况。

至于规范中要求这个from section 25.7的确切部分(重点是我的):

值类型约束指定用于类型参数的类型参数必须是值类型(§25.7.1)。具有值类型约束的任何不可为空的结构类型、枚举类型或类型参数都满足此约束。具有值类型约束的类型参数不应同时具有构造函数约束。System.Nullable类型为T。指定了不可为空值类型约束。因此,以递归方式构造的T??和Nullable**<**Nullable**<**T**>>** 是禁止的。

票数 19
EN

Stack Overflow用户

发布于 2009-03-01 17:10:53

我相信你只能在Nullable中使用非空值类型。因为Nullable本身是可以为空的,所以这种嵌套方式是被禁止的。

来自http://msdn.microsoft.com/en-us/library/kwxxazwb.aspx

公共可空(T值)

类型:t A值类型。

票数 14
EN

Stack Overflow用户

发布于 2009-03-01 17:45:59

Nullable很特别,因为CLR中内置了对Nullable类型的装箱和拆箱的显式支持:

如果对Nullable<T>使用MSIL box指令,实际上会得到一个null作为结果。没有其他值类型会在装箱时产生null。

对拆箱也有类似和对称的支持。

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

https://stackoverflow.com/questions/600115

复制
相关文章

相似问题

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