一直在浏览 .NET 源代码.NET框架参考源,只是为了好玩。并发现了一些我不明白的东西。
有一个Int32.cs包含 C# 代码的文件Int32
类型。不知怎的,这对我来说似乎很奇怪。 C#编译器如何编译代码Int32
type?
public struct Int32: IComparable, IFormattable, IConvertible {
internal int m_value;
// ...
}
但这在 C# 中不是非法的吗?如果int
只是一个别名为 Int32
,它应该无法编译错误CS0523:
“struct1”类型的结构成员“struct2 field”导致结构布局中出现循环。
编译器有什么魔力吗,还是我完全偏离了轨道?
这在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)如何确定一组结构类型何时是循环的细节非常有趣。我会尝试在某个时候写一篇关于此的博客文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)