Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编译器如何识别Nullable<;T>;成为';特殊类型';?_C#_.net_Generics_Clr_Nullable - Fatal编程技术网

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();
}