gpt4 book ai didi

c# - 编译器如何将 Nullable 识别为 'special type' ?

转载 作者:行者123 更新时间:2023-11-30 12:28:25 25 4
gpt4 key购买 nike

Nullable<T>是具有以下定义的结构:

public struct Nullable<T> where T : struct

哪里struct是类型约束,因此 T 被约束为(根据规范 §4.4.4):

  • 结构类型或枚举类型
  • 不是可为空的类型。

在源代码中查找 Nullable<T>没有特殊属性([Serializable] 除外),那么编译器如何将其识别为“可空类型”?

回应以下评论:

intInt32别名 :

(§4.1.4) simple types are identified through reserved words, but these reserved words are simply aliases for predefined struct types in the System namespace

T?Nullable<T>简写 :

(§4.1.10) - A nullable type is written T?, where T is the underlying type. This syntax is shorthand for System.Nullable, and the two forms can be used interchangeably.

这似乎是一个明显的差异,但未在下面反射(reflect)出来。

那么编译器如何将一个简单的结构(没有特殊代码)识别为“可空类型”,结构名称?

最佳答案

基于 Shared Source CLI 2.0 , Nullable<T>通过 PREDEFTYPEDEF 变得“特殊”宏,它采用名称“System.Nullable”并将其映射到属性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)

然后像这样在其他地方使用:

来自 sscli20\csharp\sccomp\nullable.cpp :

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

对于阅读此问题的人,您可能是 Shared Source CLI 2.0 Internals 的目标受众,作为免费电子书发布。

关于c# - 编译器如何将 Nullable<T> 识别为 'special type' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com