3

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

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

   public const int MaxValue = 0x7fffffff;

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

4

3 回答 3

5

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

问题是该Int32结构包含一个Int32字段。

“站在什么int立场上?” “你很聪明,年轻人,很聪明,”老太太说。“但它int一直在下降!”

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

于 2013-05-14T09:38:43.390 回答
0

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

struct MyStruct
{
  internal MyStruct m_value;
}

给出:

错误 CS0523:“SomeNamespace.MyStruct”类型的结构成员“SomeNamespace.MyStruct.m_value”导致结构布局中出现循环

编译时错误。所以一定有什么魔力Int32

更新:请参阅线程如果 Int32 只是 int 的别名,那么 Int32 类如何使用 int?.

于 2013-05-14T09:30:29.160 回答
0

好吧,它与 alias 几乎相同,这将把 int 放在使用 int32 的任何地方,因为 MaxValue 是常量,它不会用该值创建。

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

于 2013-05-14T09:25:17.730 回答