如果Int32只是int的别名,Int32类如何使用int?

一直在浏览.NET Framework Reference Source的 .NET源代码,只是为了好玩。 发现了一些我不明白的东西。

有一个Int32.cs文件,用于Int32types的C#代码。 不知何故,这对我来说似乎很奇怪。 C#编译器如何编译Int32types的代码?

 public struct Int32: IComparable, IFormattable, IConvertible { internal int m_value; // ... } 

但在C#中这不是非法的吗? 如果int只是Int32别名 ,则它将无法编译错误CS0523 :

types为“struct1”的结构成员“struct2字段”会在结构布局中产生一个循环。

在编译器中是否有一些神奇的东西,还是我完全偏离了轨道?

在C#中这不是非法的吗? 如果“int”只是“Int32”的别名,它将不能编译错误CS0523。 编译器有一些神奇的东西吗?

是; 错误在编译器中被故意压制。 如果所讨论的types是内置types,则循环检查器会被完全跳过。

通常这种事情是非法的:

 struct S { S s; int i; } 

在这种情况下,S的大小是不确定的,因为无论S的大小是多less,都必须等于它本身加上一个int的大小。 没有这样的大小。

 struct S { S s; } 

在这种情况下,我们没有任何信息可以推断出S的大小。

 struct Int32 { Int32 i; } 

但在这种情况下,编译器提前知道System.Int32是四个字节,因为它是一个非常特殊的types。

顺便提一下,C#编译器(以及CLR)如何确定何时一组结构types是循环的细节非常有趣。 我会尽力写一篇有关这方面的博客文章。

intInt32的别名,但是您正在查看的Int32结构仅仅是元数据,它不是一个真正的对象。 int m_value声明可能只是为了给结构适当的大小,因为它实际上从来没有被其他地方引用(这就是为什么它被允许在那里)。

所以,换句话说,编译器将这个保存起来成为一个问题。 在MSDN论坛上有关于这个主题的讨论 。

从讨论中,这里是所选答案的引用,有助于确定如何声明是可能的:

而types包含一个整数的m_value字段是真的 – 该字段从不被引用。 在每个支持方法(CompareTo,ToString等)中,都使用“this”来代替。 可能只有m_value字段才能强制结构具有适当的大小。

我怀疑当编译器看到“int”时,它将其转换为“mscorlib.dll中的System.Int32的引用,稍后解决”,并且由于它正在构buildmscorlib.dll,因此它最终会产生一个循环引用但没有一个会造成问题,因为m_value从来没有使用)。 如果这个假设是正确的,那么这个技巧只适用于特殊的编译器types。

进一步阅读,可以确定该结构仅仅是元数据,而不是一个真实的对象,所以它不受同样的recursion定义限制。