int和Int32,它们真的是别名吗?

3

在研究为什么我的DataContractSerializer无法序列化我的结构体,但使用int时可以正常工作时,我查看了Int32的源代码,并发现了一段奇怪的代码

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

   public const int MaxValue = 0x7fffffff;

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

你有检查过这篇文章吗:https://dev59.com/zWoy5IYBdhLWcg3wUcf_ - Saravanan
11
int是站在什么上面的?”“你很聪明,年轻人,非常聪明,”老太太说,“但所有的都是int!” - CodesInChaos
@saravanan 检查了问题但不确定相关性。如果 Int32 包含 int,int 如何成为 Int 的别名?这里是否也存在堆栈溢出的担忧? - Observer
@CodesInChaos 栈溢出问题? - Observer
3个回答

5

intInt32对这个问题不重要。字段显示为int只是因为您用于查看它的工具在显示时将这些类型替换为它们的别名。如果您使用较低级别的工具查看,则会发现它不知道int,只知道Int32

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

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

解决此问题需要使用魔法。运行时知道Int32是什么,并给予其特殊处理,避免无限递归。您不能编写包含自身作为字段的自定义结构。 Int32是内置类型,不是普通的结构。它只是出于一致性而出现为结构。


1
正如亚瑟·克拉克的第三定律所述:“任何足够先进的技术都是不可区分于魔法的”。 - Jodrell

0

这与别名几乎相同。它的作用是将 int 放在 int32 使用的任何地方,因为 MaxValue 是常量,所以不会使用该值创建。

因此,基本上创建 int32 将创建一个仅包含 int 的单个元素结构。但由于使用结构,可以随时获取 MaxValue。


0

这个问题并不像看起来那么愚蠢,因为通常情况下,在结构体内部有一个与整个结构体类型相同的实例字段会导致循环结构布局。例如,以下代码是无法正常工作的:

struct MyStruct
{
  internal MyStruct m_value;
}

给出:

错误 CS0523:类型为“SomeNamespace.MyStruct”的结构成员“SomeNamespace.MyStruct.m_value”在结构布局中引起循环

编译时错误。因此,对于Int32必须有一些魔法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接