在研究为什么我的DataContractSerializer无法序列化我的结构体,但使用int时可以正常工作时,我查看了Int32的源代码,并发现了一段奇怪的代码
public struct Int32 : ...
{
internal int m_value;
public const int MaxValue = 0x7fffffff;
如果Int32和int是别名,那么为什么int会在Int32内部声明?
在研究为什么我的DataContractSerializer无法序列化我的结构体,但使用int时可以正常工作时,我查看了Int32的源代码,并发现了一段奇怪的代码
public struct Int32 : ...
{
internal int m_value;
public const int MaxValue = 0x7fffffff;
int
和Int32
对这个问题不重要。字段显示为int
只是因为您用于查看它的工具在显示时将这些类型替换为它们的别名。如果您使用较低级别的工具查看,则会发现它不知道int
,只知道Int32
。
问题在于Int32
结构包含一个Int32
字段。
"
int
站在什么上面?" "你很聪明,年轻人,非常聪明,"老太太说。"但它一直是int
!"
解决此问题需要使用魔法。运行时知道Int32
是什么,并给予其特殊处理,避免无限递归。您不能编写包含自身作为字段的自定义结构。 Int32
是内置类型,不是普通的结构。它只是出于一致性而出现为结构。
这与别名几乎相同。它的作用是将 int 放在 int32 使用的任何地方,因为 MaxValue 是常量,所以不会使用该值创建。
因此,基本上创建 int32 将创建一个仅包含 int 的单个元素结构。但由于使用结构,可以随时获取 MaxValue。
这个问题并不像看起来那么愚蠢,因为通常情况下,在结构体内部有一个与整个结构体类型相同的实例字段会导致循环结构布局。例如,以下代码是无法正常工作的:
struct MyStruct
{
internal MyStruct m_value;
}
给出:
错误 CS0523:类型为“SomeNamespace.MyStruct”的结构成员“SomeNamespace.MyStruct.m_value”在结构布局中引起循环
编译时错误。因此,对于Int32
必须有一些魔法。
更新:请参见线程如果Int32只是int的别名,那么Int32类如何使用int?。
int
是站在什么上面的?”“你很聪明,年轻人,非常聪明,”老太太说,“但所有的都是int
!” - CodesInChaos