如果您深入了解,C# 中的值类型会被编译器/CLR 非常特殊地处理。但是 CLR 内部的类型被更特殊地对待。这就是我的意思:
int a = 5;
int b = 10;
int с = a + b;
a.CompareTo(b);
您可以将鼠标悬停int
在 Visual Studio 中,然后查看它实际上是System.Int32
struct。没关系。现在您可以抓住 ILDasm 并查看它是什么System.Int32
:转过身来,它是一个非常简单的结构,具有一个类型字段int32
(这是int32
CLR 内部的),并且没有用于加法的重载运算符。
那么,这是如何int с = a + b
工作的呢?我再次抓住 ILDasm 并查看 IL。事实证明,System.Int32
IL 代码中没有:编译器自动理解它应该将其替换为int32
. 并且有 IL 指令add
适用于int32
堆栈上的几个。更让我开心的是,CLR 允许调用System.Int32
on的实例方法int32
。对我来说,这就像一些黑魔法。
所以,这里有一个纯粹的理论问题:似乎它System.Int32
和其他类型一样,它可以在 C# 中以某种方式创建吗?如果可以的话,你能用它做任何有用的事情吗(实际int32
字段是私有的)?
编辑:好的,为了更清楚一点:这个问题与int
别名无关System.Int32
。可以采用提供的示例,替换int
为System.Int32
并跳过示例后的第一段。真正的问题是关于valuetype [mscorlib]System.Int32 a
在您的 IL 代码中包含而不是仅包含int32 a
.