- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Nullable<T>
是具有以下定义的结构:
public struct Nullable<T> where T : struct
哪里struct
是类型约束,因此 T 被约束为(根据规范 §4.4.4):
在源代码中查找 Nullable<T>
没有特殊属性([Serializable]
除外),那么编译器如何将其识别为“可空类型”?
回应以下评论:
int
是 Int32
的别名 :
(§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/
我是一名优秀的程序员,十分优秀!