我得到了下面的代码:装箱和拆箱,为什么输出都不是“System.Object”?
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
输出是:
System.Int32
System.Object
他们为什么不都System.Object
?
我得到了下面的代码:装箱和拆箱,为什么输出都不是“System.Object”?
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
输出是:
System.Int32
System.Object
他们为什么不都System.Object
?
如果你问为什么boxedObject.GetType()不返回对象.. 检查出的部分'拳击转换'在MSDN Boxing and Unboxing page下的图像。好问题btw ..至少我理解你的问题。
虽然我可能不是技术上是正确的,它看起来像
忽略拳击的话题,所有的类都从类型对象继承。对于参考类型和值类型都是如此。 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());
ClassA的
ClassB的
ClassC
值类型并不真正从Object派生。它们完全在类型层次结构之外。然而,对于每个值类型,都有一个类型类型,它来自具有讽刺名称的ValueType(尽管它的名称是类类型)。系统在每个值类型及其相应的自动生成的类类型之间定义隐式双向转换运算符。从值类型到类类型的隐式转换称为“装箱”;反向转换是“拆箱”。 – supercat 2011-09-13 06:52:16
@supercat:随意编辑答案,如果你想:) – 2011-09-13 07:20:55
这是不是真正的拳击;这是关于GetType
的行为。它返回变量的值的的类型,而不是变量是类型声明有:
object var4 = new List<string>();
Console.WriteLine(var4.GetType().ToString());
将不会返回System.Object
无论是。
它将返回实例的类型,而不是参考的类型 – 2010-08-10 09:01:14
变量的声明只是编译时的信息,而方法的执行是运行时。换句话说,GetType()无法知道对象的声明类型,因为它只能在运行时知道对象的实际类型。
类似的,如果你有
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
调用bInstance.GetType()不知道该变量被宣布为“A”型的方式,我不认为你希望它返回“一个'在这种情况下。然而在上面的例子中,a是我对象的缩写,而b是System.Int32
@Also OP,Console.WriteLines都可以工作,即使没有显式的ToString() - 如果你的参数会被隐式调用类型是一个对象。 – Gishu 2010-08-10 09:23:06
删除了称呼:“提前致谢”,也删除了标题中的非法单词:“关于”的问题,下次不要这样做 – 2015-05-18 18:57:37