我收到了以下代码:
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
输出结果为:
System.Int32
System.Object
为什么他们不是System.Object
?
答案 0 :(得分:7)
GetType()
函数返回变量中实例的实际类型。
即使您的变量声明为object
,它实际上持有一个盒装Int32
实例。
答案 1 :(得分:4)
如果你问为什么boxedObject.GetType()没有返回Object .. 检查MSDN Boxing and Unboxing page上“拳击转换”部分下的图像。好问题btw ..至少我对你的问题的理解。
虽然技术上可能不正确,但看起来像是
答案 2 :(得分:3)
忽略拳击主题,所有类都继承自类型对象。对于引用类型和值类型都是如此。 GetType显示派生类型最多,在本例中为System.Int32。
如果你这样做,GetType将返回System.Object的少数几次之一:
object var = new Object();
Console.WriteLine(var.GetType().ToString());
Boxing是指引用类型指向值类型的时间。通常,这是作为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());
ClassA的
ClassB的
ClassC
答案 3 :(得分:1)
这不是真的关于拳击;这是关于GetType
的行为。它返回变量的值的类型,而不是变量声明的类型:
object var4 = new List<string>();
Console.WriteLine(var4.GetType().ToString());
也不会返回System.Object
。
答案 4 :(得分:1)
变量的声明是仅编译时间信息,而方法执行是运行时。换句话说,GetType()无法知道对象被声明的类型,因为它只能在运行时知道对象的实际类型。
如果你有
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
对bInstance.GetType()的调用无法知道变量被声明为类型'a',我认为你不希望它在这种情况下返回'a'。但是在上面的例子中,a是我的对象缩写,b是System.Int32