在查看Int32的源代码,同时做了一些研究,为什么我的DataContractSerializer不会序列化我的结构但是当使用int它工作正常时,我遇到了一些奇怪的代码
public struct Int32 : ...
{
internal int m_value;
public const int MaxValue = 0x7fffffff;
如果Int32和int是别名,为什么在Int32内部声明int?
答案 0 :(得分:5)
int
与Int32
与此问题无关。该字段显示为int
只是因为您用来查看它的工具在显示它们时用别名替换这些类型。如果你看一下使用较低级别的工具,你会发现它不知道int
,只知道Int32
。
问题是Int32
结构包含Int32
字段。
“
int
站在什么位置?” “你很聪明,年轻人,非常聪明,”老太太说。 “但它int
一直在下降!”
此问题的解决方案是 magic 。运行时知道Int32
是什么,并为其提供特殊处理,避免无限递归。您不能编写将自身包含为字段的自定义结构。 Int32
是内置类型,没有普通结构。为了一致性,它只是作为结构出现。
答案 1 :(得分:0)
它和别名几乎一样 这样做会把int放在使用int32的地方,因为MaxValue是常量,不会用值创建。
所以基本上创建int32将创建一个只有int的元素结构。但是由于使用结构MaxValue可以随时获得。
答案 2 :(得分:0)
这个问题并不像看起来那么愚蠢,因为通常会导致循环结构布局在struct
内部具有与整个结构相同类型的实例字段。例如,这将无法正常工作:
struct MyStruct
{
internal MyStruct m_value;
}
给出:
错误CS0523:结构成员' SomeNamespace.MyStruct.m_value'类型 ' SomeNamespace.MyStruct'导致结构布局中的循环
编译时错误。所以Int32
必须有一些魔力。
更新:请参见主题If Int32 is just an alias for int, how can the Int32 class use an int?。