我在这里很不确定:
Image i=some image...
Bitmap B=(Bitmap)i;B现在指向与i相同的对象。我很困惑……我会说Bitmap B将指向转换为位图的Image的新实例,但显然不是这样。那么我就不明白它在这里是如何工作的。
发布于 2011-02-21 18:03:12
强制转换不会创建新对象(至少,除非是new conversion operators。它只是指示编译器如何“处理”一个对象。在您给出的例子中,您告诉编译器“别担心,相信我,B实际上是一个Bitmap”。如果事实证明你向它撒了个小谎言,运行时会通过在运行时抛出一个InvalidCastException来抓住你。
MSDN有更多信息。
强制转换是一种显式通知编译器您打算进行转换并且您知道可能会发生数据丢失的方式
发布于 2011-02-21 18:24:22
狗是动物的一种特殊形式。狗有狗特有的属性和行为(bark,lickPrivateParts),但也具有Animal组的所有成员共同的属性和行为(numberOfChromosomes,breathe,eat等)。
如果你向动物施展一只狗,你就是在向上施展(将一个更专业的类作为一个不太专业的基类)。当转换为动物时,编译器/运行时将“看到”狗作为基本的动物,并且狗的特定属性和行为将不适用于这个向上转换的狗-动物。这是有道理的,因为,例如,普通动物不会“叫”。
执行此操作时,您不是在创建新的Animal实例,而是在使用Dog,就好像它是一个不太专业的Animal对象一样。
同样,如果将位图转换为图像,则(在将位图视为图像期间)只能访问图像的字段/属性,而不能访问位图。
值得一提的是,您在示例中所做的是向下转换(从不太专业的对象到更专业的对象)。这并不总是安全或明智的-如果你仔细想想,Animal类的实例没有特定于Dog的属性的值或定义。
发布于 2011-02-21 18:03:28
使用new Obj()创建新对象时,将创建一个新对象。当您将该对象强制转换为另一个对象类型时,该对象保持不变,只有运行库会将该对象作为不同类型使用。
您可以将列表强制转换为IEnumerable,并使用与IEnumerable类型相同的列表对象工作。
只有当要强制转换的对象是要强制转换的对象的基类时,这才有效。-要强制转换的对象实现要强制转换到的接口。-该对象提供对结果类型的特定转换。(使用显式操作符)。
https://stackoverflow.com/questions/5064534
复制相似问题