【问题标题】:int vs Int32. Are they really aliases? [duplicate]int 与 Int32。他们真的是别名吗? [复制]
【发布时间】:2013-05-14 09:19:59
【问题描述】:

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

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

   public const int MaxValue = 0x7fffffff;

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

【问题讨论】:

  • 你查看过这篇文章了吗:stackoverflow.com/questions/8626056/…
  • "int 站在什么位置?" “你很聪明,年轻人,很聪明,”老太太说。 “但它一直是ints!”
  • @saravanan 检查了问题,但不确定相关性。如果 Int32 包含和 int,int 如何成为 Int32 的别名。这里是否也存在堆栈溢出问题?
  • @CodesInChaos 堆栈溢出问题?

标签: c# .net value-type


【解决方案1】:

intInt32 与此问题无关。该字段显示为int 只是因为您用来查看它的工具在显示它们时用它们的别名替换了这些类型。如果您使用较低级别的工具查看它,您会发现它不知道int,只知道Int32

问题在于Int32 结构包含Int32 字段。

int 站在什么上面?” “你很聪明,年轻人,很聪明,”老太太说。 “但它一直是ints!”

解决这个问题的方法是魔法。运行时知道Int32 是什么,并对其进行特殊处理以避免无限递归。您不能编写包含自身作为字段的自定义结构。 Int32 是内置类型,没有普通结构。为了一致性起见,它只是显示为结构。

【讨论】:

  • 正如 Arthur C. Clarke 的第三定律:“任何足够先进的技术都与魔法无异”。
【解决方案2】:

嗯,它几乎和别名一样 这样做会将 int 放在使用 int32 的任何地方,因为 MaxValue 是常量,它不会使用该值创建。

所以基本上创建 int32 将创建一个只有 int 的元素结构。但是由于使用结构 MaxValue 可以随时获得。

【讨论】:

    【解决方案3】:

    这个问题并不像看起来那么愚蠢,因为通常它会导致循环结构布局在struct 内有一个实例字段,该字段与整个结构具有相同的类型。例如,这将不起作用,clealy:

    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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多