Skip to Content
MUZINET-NOTE 4.0 is released 🎉
技术知识库C#向上转型与向下转型

💡 C# 向上转型与向下转型

很多人初学 C# 时,对“向上转型”和“向下转型”感到困惑。
它们其实是 继承与多态机制的核心
这篇文章带你三分钟彻底搞懂。


🧱 一、继承关系示例

class Animal { public void Eat() => Console.WriteLine("Animal is eating"); } class Dog : Animal { public void Bark() => Console.WriteLine("Dog is barking"); }

Dog 继承自 Animal,说明 Dog 是一种 Animal。 接下来就能理解转型的意义。


🧩 二、向上转型(Upcasting)

向上转型:子类 → 父类。 例如:

Dog dog = new Dog(); Animal animal = dog; // 向上转型 animal.Eat(); // ✅ OK // animal.Bark(); ❌ 不行
  • 向上转型是 自动转换,无需强制。
  • 安全可靠,因为子类一定包含父类的所有成员。

👉 作用:屏蔽子类细节,让代码更通用。 这是实现 多态 的基础。


🔄 三、向下转型(Downcasting)

向下转型:父类 → 子类。 例如:

Animal animal = new Dog(); Dog dog = (Dog)animal; // 向下转型 dog.Bark(); // ✅ OK

但要小心:

Animal animal = new Animal(); Dog dog = (Dog)animal; // ❌ InvalidCastException

向下转型是 强制转换,如果类型不匹配,会抛出异常。 所以要 谨慎使用


✅ 四、安全的转型方式

C# 提供了更安全的写法:

✔ 1. is 模式匹配

if (animal is Dog d) { d.Bark(); }

✔ 2. as 安全转换

Dog? d = animal as Dog; if (d != null) { d.Bark(); }

这两种方式都能避免运行时崩溃。


⚙️ 五、多态的意义

如果父类方法被声明为 virtual, 子类可以 override 重新定义。 即使向上转型,也能调用子类实现:

class Animal { public virtual void Eat() => Console.WriteLine("Animal Eat"); } class Dog : Animal { public override void Eat() => Console.WriteLine("Dog Eat"); } Animal a = new Dog(); a.Eat(); // 输出:Dog Eat

👉 这就是运行时多态的真正含义。


🧭 六、总结表格

类型含义安全性是否自动
向上转型子类 → 父类✅ 安全✅ 自动
向下转型父类 → 子类⚠️ 有风险❌ 需强制

一句话总结:向上安全,向下小心。


💬 结语

理解向上转型和向下转型, 你就掌握了 C# 面向对象编程的核心逻辑。

👉 关注我,获取全部在线文档。

最后更新于