我得到以下代码:
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
输出是:
System.Int32
System.Object
为什么不是他们俩System.Object
?
该GetType()
函数返回变量中实例的实际类型。
即使您的变量被声明为object
,它实际上包含一个装箱的Int32
实例。
如果您问为什么 boxedObject.GetType() 不返回 Object..请查看MSDN 装箱和拆箱页面上“装箱转换”部分下的图像。顺便说一句,好问题..至少我对你的问题的理解。
虽然我在技术上可能不正确,但看起来像
忽略拳击的话题,所有的类都继承自类型对象。对于引用类型和值类型都是如此。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