int vs Int32。它们真的是别名吗?

时间:2013-05-14 09:20:00

标签: c# .net value-type

在查看Int32的源代码,同时做了一些研究,为什么我的DataContractSerializer不会序列化我的结构但是当使用int它工作正常时,我遇到了一些奇怪的代码

public struct Int32 : ...
{
   internal int m_value;

   public const int MaxValue = 0x7fffffff;

如果Int32和int是别名,为什么在Int32内部声明int?

3 个答案:

答案 0 :(得分:5)

intInt32与此问题无关。该字段显示为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?