我得到以下代码:

object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());

输出是:

System.Int32
System.Object

为什么他们不都是 System.Object?

有帮助吗?

解决方案

如果您问为什么 boxedObject.GetType() 不返回 Object.. 查看“拳击转换”部分下的图像MSDN 装箱和拆箱页面. 。顺便说一句,好问题..至少我对你的问题的理解。

虽然我在技术上可能不正确,但看起来像

  • 当移动到堆时,会创建一个新对象 - 其 Type 指针设置为原始值类型的 Type 对象 (此处为 System.Int32)。这解释了 GetType() (以及如果您尝试将其拆箱为其他类型时出现的错误)。
  • 然后将实际值复制到该对象中。

其他提示

GetType() 函数返回变量中实例的实际类型。

即使你的变量被声明为 object, ,实际上是 保持 盒装的 Int32 实例。

忽略装箱主题,所有类都继承自类型对象。对于引用类型和值类型都是如此。GetType 显示最派生的类型,在本例中为 System.Int32。

GetType 将返回 System.Object 的少数情况之一是如果您执行以下操作:

object var = new Object();
Console.WriteLine(var.GetType().ToString());

装箱是指引用类型指向值类型的情况。通常,这是作为 System.Object 引用完成的。TypeOf 将返回最派生的实际类型,而不是引用类型。

class A
{
}

class B : A
{
}

class C : B
{
}

object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();

GetType 将为这些类型做类似的事情。

System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());

A级
B级
C类

这实际上与拳击无关;而是关于拳击。这是关于行为的 GetType. 。它返回的类型 价值 变量的类型,而不是变量的类型 宣布 和:

    object var4 = new List<string>();
    Console.WriteLine(var4.GetType().ToString());

不会回来 System.Object 任何一个。

变量的声明只是编译时的信息,而方法的执行是运行时的。换句话说,GetType() 无法知道对象被声明的类型,因为它只能在运行时知道对象的实际类型。

类似如果你有

class a
{
}

class b : a

a bInstance = new b();
bInstance.GetType();

对 bInstance.GetType() 的调用无法知道该变量被声明为类型“a”,并且我认为您也不希望它在这种情况下返回“a”。但是在上面的示例中,a 是我的 object 缩写,b 是 System.Int32

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top