一直在浏览.NET Framework Reference Source的 .NET源代码,只是为了好玩。并发现了我不明白的东西。
有一个带有C#代码类型的 Int32.cs 文件Int32。某种程度上,这对我来说似乎很奇怪。C#编译器如何为Int32类型编译代码?
Int32
public struct Int32: IComparable, IFormattable, IConvertible { internal int m_value; // ... }
但是这在C#中不是非法的吗?如果int仅是的 别名 Int32,则它将无法编译,并显示错误CS0523:
int
类型为“ struct1”的结构成员“ struct2字段”导致结构布局中的循环。
编译器中有魔术吗,还是我完全偏离了轨道?
这在C#中不是非法的吗?如果“ int”仅是“ Int32”的别名,则它将无法编译,并显示错误CS0523。编译器中有魔术吗?
是; 该错误在编译器中被有意消除。如果所讨论的类型是内置类型,则将完全跳过循环检查器。
通常,这种事情是非法的:
struct S { S s; int i; }
在那种情况下,S的大小是不确定的,因为无论S的大小是多少,它都必须等于自身加上int的大小。没有这样的大小。
struct S { S s; }
在那种情况下,我们没有信息可用来推断S的大小。
struct Int32 { Int32 i; }
但是在这种情况下,编译器会提前知道System.Int32四个字节,因为它是一个非常特殊的类型。
System.Int32
顺便说一句,关于C#编译器(就此而言,还是CLR)如何确定一组结构类型何时是循环的细节非常有趣。我将在某个时候尝试撰写有关此内容的博客文章。