C#中Person类型变量指向Student实例时GetType为何返回Student类型
问题解答
该现象是C#中编译时类型和运行时类型分离的正常表现,GetType()方法的设计逻辑就是返回对象的运行时实际类型,和变量的声明类型无关。
核心概念说明
- 编译时类型:指声明变量时指定的类型,属于编译期的静态约束。代码中
Person p就代表变量p的编译时类型为Person,编译器只会允许你通过p调用Person类中定义的成员,如果你尝试调用Student类独有的成员会直接编译报错。 - 运行时类型:指变量实际指向的堆内存中对象的真实类型,是程序运行时的动态类型。示例代码中先实例化了
Student对象,再把这个实例赋值给父类Person类型的变量,本质上只是做了类型的隐式向上转换,底层存储的实例本身还是Student类型,没有发生任何变化。
GetType()方法特性
GetType()是继承自object基类的方法,它的实现逻辑就是读取实例对象的类型元数据,返回的永远是实例的运行时真实类型,不会受变量声明类型的影响。
如果需要获取变量的编译时类型,应该使用typeof运算符,示例如下:
Console.WriteLine(typeof(Person)); // 输出Person
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

