你没有直接创建Brush,而是将它的子类动态的强制转换为Brush了,从子类转换基类是可以的(丢失信息为代价),从基类转换为子类就不可以了(不能填充子类的某些数据段)

解决方案 »

  1.   

    Brush类是个抽象类,它确实不能被实例化,若要创建一个画笔对象,请使用从 Brush 派生出的类,如 SolidBrush、TextureBrush 和 LinearGradientBrush。
    Brush aa=Brushes.Yellow;(获取系统定义的 Brush 对象)
    Brush bb=new SolidBrush(Color.red);(从SolidBrush实例化对象)
    其中的Brush代表对象的类型是Brush,而不是通过Brush实例化。也就是说,不能用 new Brush()来创建画笔对象。
      

  2.   

    是的,这是面向对象的基本特性,可以实现运行时的多态。
    solidbrush类是brush类的子类,并且不是抽象类,因此可以创建实例,并且可以向上映射到父类,这种转换是安全的。这样的用法你在c#里面会经常遇到的。其他的例如将接口实现类实例赋值给接口变量也是一样的道理