8

我得到以下代码:

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

输出是:

System.Int32
System.Object

为什么不是他们俩System.Object

4

5 回答 5

7

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

即使您的变量被声明为object,它实际上包含一个装箱的Int32实例。

于 2010-08-10T08:51:40.680 回答
4

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

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

  • 当移动到堆中时,会创建一个新对象 -它的 Type 指针设置为原始值类型的 Type 对象(此处为 System.Int32)。这解释了 GetType() (以及如果您尝试将其拆箱为不同类型的错误)。
  • 然后将实际值复制到该对象中。
于 2010-08-10T09:10:21.100 回答
3

忽略拳击的话题,所有的类都继承自类型对象。对于引用类型和值类型都是如此。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

于 2010-08-10T08:53:54.937 回答
1

这与拳击无关。这是关于 的行为GetType。它返回变量值的类型,而不是声明变量的类型:

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

也不会回来System.Object

于 2010-08-10T08:56:40.177 回答
0

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

如果你有类似的

class a
{
}

class b : a

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

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

于 2010-08-10T09:36:45.727 回答