一尘不染

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

c#

一直在浏览.NET Framework Reference
Source的

.NET源代码,只是为了好玩。并发现了我不明白的东西。

有一个带有C#代码类型的 Int32.cs 文件Int32。某种程度上,这对我来说似乎很奇怪。C#编译器如何为Int32类型编译代码?

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

    // ... 
}

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

类型为“ struct1”的结构成员“ struct2字段”导致结构布局中的循环。

编译器中有魔术吗,还是我完全偏离了轨道?


阅读 358

收藏
2020-05-19

共1个答案

一尘不染

这在C#中不是非法的吗?如果“ int”仅是“ Int32”的别名,则它将无法编译,并显示错误CS0523。编译器中有魔术吗?

是; 该错误在编译器中被有意消除。如果所讨论的类型是内置类型,则将完全跳过循环检查器。

通常,这种事情是非法的:

struct S { S s; int i; }

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

struct S { S s; }

在那种情况下,我们没有信息可用来推断S的大小。

struct Int32 { Int32 i; }

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

顺便说一句,关于C#编译器(就此而言,还是CLR)如何确定一组结构类型何时是循环的细节非常有趣。我将在某个时候尝试撰写有关此内容的博客文章。

2020-05-19