C# 编译器如何识别Nullable<;T>;成为';特殊类型';?
C# 编译器如何识别Nullable<;T>;成为';特殊类型';?,c#,.net,generics,clr,nullable,C#,.net,Generics,Clr,Nullable,Nullable是具有以下定义的结构: public struct Nullable<T> where T : struct public结构可为null,其中T:struct 其中,struct是一种类型约束,因此T被约束为(根据规范§4.4.4): 结构类型或枚举类型 不是可为空的类型 在源代码中查找Nullable没有特殊属性(除了[Serializable]),那么编译器如何将其识别为“Nullable类型” 针对以下评论: int是Int32的别名: (§4.1.4
Nullable
是具有以下定义的结构:
public struct Nullable<T> where T : struct
public结构可为null,其中T:struct
其中,struct
是一种类型约束,因此T被约束为(根据规范§4.4.4):
- 结构类型或枚举类型
- 不是可为空的类型李>
Nullable
没有特殊属性(除了[Serializable]
),那么编译器如何将其识别为“Nullable类型”
针对以下评论:
int
是Int32
的别名:
(§4.1.4)通过保留字识别简单类型,但
保留字只是中预定义结构类型的别名
系统名称空间
T?
是可为空的的缩写:
(§4.1.10)-可空类型写为T?,其中T是基础类型
类型。对于System.Nullable和
表格可以互换使用
这似乎是一个明显的区别,下面没有反映出来
那么,编译器如何将简单结构(没有特殊代码)识别为“可空类型”,结构名称呢?基于,可空
通过名为“System.nullable
的PREDEFTYPEDEF
宏变得“特殊”并将其映射到属性PT_G_OPTIONAL
,该属性将在编译器的其余部分中进行检查
关于int
→ System.Int32
等,参见“好名字”栏
从sscli20\csharp\inc\predeftype.h
:
// id full type name required simple numer AggKind fund type elementtype, nice name, zero, quasi simple numer, attribute arg size serialization type, predef attribute, arity, in mscorlib)
PREDEFTYPEDEF(PT_BYTE, "System.Byte", 1, 1, 1, Struct, FT_U1, ELEMENT_TYPE_U1, L"byte", 0, 0, 1, SERIALIZATION_TYPE_U1, PA_COUNT, 0, 1)
PREDEFTYPEDEF(PT_SHORT, "System.Int16", 1, 1, 1, Struct, FT_I2, ELEMENT_TYPE_I2, L"short", 0, 0, 2, SERIALIZATION_TYPE_I2, PA_COUNT, 0, 1)
PREDEFTYPEDEF(PT_INT, "System.Int32", 1, 1, 1, Struct, FT_I4, ELEMENT_TYPE_I4, L"int", 0, 0, 4, SERIALIZATION_TYPE_I4, PA_COUNT, 0, 1)
PREDEFTYPEDEF(PT_LONG, "System.Int64", 1, 1, 1, Struct, FT_I8, ELEMENT_TYPE_I8, L"long", &longZero, 0, 8, SERIALIZATION_TYPE_I8, PA_COUNT, 0, 1)
// ... snip ...
// Nullable<T>
PREDEFTYPEDEF(PT_G_OPTIONAL, "System.Nullable", 0, 0, 0, Struct, FT_STRUCT, ELEMENT_TYPE_END, NULL, 0, 0, 0, 0, PA_COUNT, 1, 1)
对于那些阅读这个问题的人来说,你可能是这本免费电子书的目标读者。这是一种特殊类型;这也是编译器将“int?”理解为“null”的原因helpful@ken2k-我不同意,这只是一个类型别名,因此编译器在编译过程中将
int?
转换为Nullable
。C#编译器当然对Nullables有很深的了解。例如,它允许他们使用??操作员,并允许操作员在其上进行转换。你问的是什么方面还不是很清楚。@Selman22-我同意这个问题更多的是关于“特殊类型”的。Eric对的响应是否所有这些特殊情况都已硬编码到编译器中?是的。
可能回答了这个问题。哇!惊人的答案。因此,简单的回答是,硬编码结构名确实是将System.Nullable
标识为特殊的结构名?
/***************************************************************************************************
Return true iff the method is the nullable ctor taking one parameter.
***************************************************************************************************/
bool FUNCBREC::IsNubCtor(METHSYM * meth)
{
return meth && meth->getClass()->isPredefAgg(PT_G_OPTIONAL) && meth->params->size == 1 &&
meth->params->Item(0)->isTYVARSYM() && meth->isCtor();
}