C#Image / Bitmap Superclass / Subclass Casting anomaly

时间:2014-11-17 14:19:15

标签: c# image bitmap

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

我的问题是:如果方法返回类型是Bitmap,为什么我需要显式转换为Bitmap?发生了什么事?

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

1 个答案:

答案 0 :(得分:0)

Image.FromFile的返回类型一个Bitmap,它是Image (MSDN Docs)

public static Image FromFile(
    string filename,
    bool useEmbeddedColorManagement
)

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


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