You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:25:10