铸造是否会创建新对象?

我在这里很不确定:

Image i=some image... Bitmap B=(Bitmap)i; 

B现在指向与i相同的对象。 我很困惑……我会说Bitmap B会指向一个新的Image实例,它被转换为位图,但显然并非如此。 然后我就是不知道它是如何工作的。

转换不会创建新对象(至少,除非定义了新的转换运算符 ,这在非数字类型中并不常见,并且不适用于您的示例)。 它只是指示编译器如何“处理”一个对象。 在你出现的情况下,你告诉编译器“不要担心,相信我, B实际上是一个Bitmap ”。 如果事实certificate你已经告诉它了,运行时将通过在运行时抛出InvalidCastException来捕获它。

MSDN有更多信息。

强制转换是一种明确告知编译器您打算进行转换的方法,并且您知道可能会发生数据丢失

动物的一种特殊forms。 狗具有狗特有的属性和行为( barklickPrivateParts ),但也具有Animal组的所有成员共同的属性和行为( numberOfChromosomesbreatheeat等)。

如果你将一只狗施放到动物身上,你正在向上倾斜 (将一个更专业的类别视为一个不太专业的基类)。 在转换为Animal时,编译器/运行时将“看到”狗作为基本动物和狗特有的属性和行为将不适用于这种最高速的狗 – 动物。 这是有道理的,因为,例如,一般动物不会’吠叫’。

在执行此操作时,您不是在创建新的Animal实例,而是使用Dog,就像它是一个不太专业的Animal对象一样。

同样,如果将位图转换为图像,您将(在您将位图视为图像的持续时间内)只能访问图像的字段/属性,而不能访问位图。

值得一提的是,您在示例中所做的是向下转换 (从较不专业化的对象转向更专业的对象)。 这并不总是安全或合理的 – 如果您考虑一下,Animal类的实例没有Dog特定属性的值或定义。

使用新的Obj()创建新对象时; 创建一个新对象。 将该对象转换为另一个对象类型时,该对象保持不变,只有运行时才能将该对象作为不同类型使用。

您可以将列表强制转换为IEnumerable,并使用与IEnumerable类型相同的列表对象进行工作。

这仅适用于 – 要转换为的对象是要转换的对象的基类。 – 要转换的对象实现要转换的接口。 – 对象为结果类型提供特定的强制转换。 (使用显式运算符)。

你在做什么看起来不明智! BitmapImage的子类,因此您始终可以获取Bitmap对象并将其称为Image ,但不能保证任何特定Image都是Bitmap 。 如果不是,您将最终抛出exception。

您可以从Image创建一个新的Bitmap ,但您必须通过创建一个新实例来实现,例如

 Image i = some image... Bitmap b = new Bitmap(i); 

这不是强制转换,即创建一个新的Bitmap对象,但是a)合法且b)合理。