C#类型转换疑问:为何Console输出类型B而非A?
为什么
A a2 = new B();调用GetType()返回B而不是A? 嘿,这个问题戳中了C#里引用类型的核心逻辑——声明类型和实际实例类型是完全两回事,我给你一步步掰扯明白:
先搞懂两个关键概念
- 声明类型:就是你写
A a2时指定的A,它只决定这个引用变量能调用哪些成员(比如A类里定义的方法),但它本身只是个“指向实例的指针/引用”,不是实例本身。 - 实际实例类型:是
new B()在内存堆上创建的对象类型,这个类型从对象诞生起就固定死了,绝不会因为用不同类型的引用来指向它而改变。
GetType()到底干了啥?
GetType()是.NET里所有对象都继承的方法,它的唯一作用就是返回对象在运行时的实际类型——也就是你new出来的那个真实类型,和引用变量的声明类型半毛钱关系都没有。
结合你的代码拆解
看你给出的这段代码:
class A { } class B : A { } A a1 = new A(); A a2 = new B(); Console.WriteLine(a2.GetType()); // 输出B
A a1 = new A();:a1这个引用指向的就是一个A类型的实例,所以GetType()返回A,完全符合预期。A a2 = new B();:a2这个引用只是“披着A的外衣”,但它实际指向的是一个实打实的B类型实例。当你调用GetType()时,方法会直接去内存里找这个对象的真实身份,自然返回B。
打个通俗的比方
把引用变量看成一个贴了标签的空盒子:
- 你给盒子贴了“水果”(A)的标签,但里面装的是“苹果”(B)。
- 当你问“盒子里的东西是什么?”(
GetType()),得到的答案肯定是“苹果”,而不是标签上的“水果”。
如果想获取引用变量的声明类型,你可以用typeof(A),它是编译时就确定的,和实际装的东西无关。
内容的提问来源于stack exchange,提问作者user8920029
相关产品推荐
相关产品推荐

