这在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)如何确定一组结构类型何时是循环的细节非常有趣。我将在某个时候尝试撰写有关此内容的博客文章。