C# 图像/位图超类/子类转换异常

本文关键字:转换 异常 子类 位图 图像 超类 | 更新日期: 2023-09-27 18:30:36

我正在阅读C#图像类。此类是抽象的。由于它是一个抽象类,我不能创建一个对象,但它有一个返回Bitmap对象的方法Image.FromFile(string path);。现在在代码中,Image img = Image.FromFile(path)有效,但Bitmap img = Image.FromFile(path)不起作用。但是,Bitmap img = (Bitmap) Image.FromFile(path)确实有效!

我的问题是:如果方法返回类型是位图,为什么我需要显式转换为位图?这是怎么回事?

澄清一下:我知道MSDN文档说该方法返回图像。当我使用断点进行检查时,图像包含位图。即使它确实包含图像,这对我来说也会更加混乱,因为图像是抽象的,所以我不可能有一个图像对象,不是吗?我在这里错过了一些明显的东西吗?

C# 图像/位图超类/子类转换异常

Image.FromFile的返回类型不是Bitmap,而是Image(MSDN Docs)。

public static Image FromFile(
    string filename,
    bool useEmbeddedColorManagement
)

因此,您需要显式强制转换才能获取所需的类型。


编辑。 Bitmap继承自Image,定义为public sealed class Bitmap : Image 。尽管当您检查从FromFile返回的对象时,您会看到基础类型为位图,但该方法旨在处理"超类"Image因此这就是它将对象视为的对象。这使也从Image继承的其他类型也可以使用此方法。经典的多态性在起作用...