为什么GetType()在将派生类显式转换为基类后返回派生类

本文关键字:派生 基类 返回 显式转换 GetType 为什么 | 更新日期: 2023-09-27 18:23:37

这当然很简单,但会困扰我一段时间,所以希望在这里得到一些详细的解释。我知道当你做的时候

BaseClass b = new DeriveClass();

由于从派生类到基类的隐式转换,b的类型仍然是BaseClass NOT DeriveClass。事实上,做也是合法的

BassClass b = (BaseClass)new DeriveClass();

但编译器不需要这样做。无论如何,我不明白的是,在这个强制转换之后,当我尝试调用b.GetType()时,它会返回DriveClass而不是BaseClass
为什么会这样?

为什么GetType()在将派生类显式转换为基类后返回派生类

GetType()始终返回实例的当前类型(在运行时检查,而不是在编译时检查)。它写在msdn:上

获取当前实例的类型。

msdn:上的代码示例

MyBaseClass myBase = new MyBaseClass();
MyDerivedClass myDerived = new MyDerivedClass();
object o = myDerived;
MyBaseClass b = myDerived;
Console.WriteLine("mybase: Type is {0}", myBase.GetType());
Console.WriteLine("myDerived: Type is {0}", myDerived.GetType());
Console.WriteLine("object o = myDerived: Type is {0}", o.GetType());
Console.WriteLine("MyBaseClass b = myDerived: Type is {0}", b.GetType());
// The example displays the following output:
//    mybase: Type is MyBaseClass
//    myDerived: Type is MyDerivedClass
//    object o = myDerived: Type is MyDerivedClass
//    MyBaseClass b = myDerived: Type is MyDerivedClass