【发布时间】:2014-02-14 10:36:59
【问题描述】:
Nullable<T> 是一个具有以下定义的结构:
public struct Nullable<T> where T : struct
其中struct 是一个类型约束,因此 T 被约束(根据规范 §4.4.4):
- 结构类型或枚举类型
- 不是可以为空的类型。
在源代码中查找Nullable<T> 没有特殊属性(除了[Serializable]),那么编译器如何将其识别为“可空类型”?
针对以下cmets:
int 是Int32 的别名:
(§4.1.4) 简单类型通过保留字标识,但这些 保留字只是 aliases 中预定义的结构类型 系统命名空间
T? 是Nullable<T> 的简写:
(§4.1.10) - 可空类型写为 T?,其中 T 是底层 类型。此语法是 System.Nullable 的简写,两者 表格可以互换使用。
这似乎是一个明显的区别,下面没有反映出来。
那么编译器如何将一个简单的结构(没有特殊代码)识别为“可空类型”,结构名称?
【问题讨论】:
-
嗯,这是一种特殊的类型;这也是编译器理解“int?”的原因。作为“可空
”。 -
您可能会发现this answer 很有帮助
-
@ken2k - 我不同意,这只是一个类型别名,所以编译器会在编译期间简单地将
int?转换为Nullable<int> -
C# 编译器当然对 Nullables 有深入的了解。例如,它允许他们使用 ??运算符并允许对它们进行提升的转换运算符。目前还不清楚您要问的是什么特定方面。
-
@Selman22 - 我同意这个问题更多地是关于“特殊类型”的。 Eric 对
Are all of these special cases hard coded into the compiler? Yes.的回复可能回答了这个问题。
标签: c# .net generics clr nullable