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文档说该方法返回图像。当我使用断点进行检查时,图像包含位图。即使它确实包含图像,这对我来说也会更加混乱,因为图像是抽象的,所以我不可能有一个图像对象,不是吗?我在这里错过了一些明显的东西吗?
Image.FromFile
的返回类型不是Bitmap
,而是Image
(MSDN Docs)。
public static Image FromFile(
string filename,
bool useEmbeddedColorManagement
)
因此,您需要显式强制转换才能获取所需的类型。
编辑。 Bitmap
继承自Image
,定义为public sealed class Bitmap : Image
。尽管当您检查从FromFile
返回的对象时,您会看到基础类型为位图,但该方法旨在处理"超类"Image
因此这就是它将对象视为的对象。这使也从Image
继承的其他类型也可以使用此方法。经典的多态性在起作用...