铸造是否会创建新对象?
我在这里很不确定:
Image i=some image... Bitmap B=(Bitmap)i;
B现在指向与i相同的对象。 我很困惑……我会说Bitmap B会指向一个新的Image实例,它被转换为位图,但显然并非如此。 然后我就是不知道它是如何工作的。
转换不会创建新对象(至少,除非定义了新的转换运算符 ,这在非数字类型中并不常见,并且不适用于您的示例)。 它只是指示编译器如何“处理”一个对象。 在你出现的情况下,你告诉编译器“不要担心,相信我, B
实际上是一个Bitmap
”。 如果事实certificate你已经告诉它了,运行时将通过在运行时抛出InvalidCastException
来捕获它。
MSDN有更多信息。
强制转换是一种明确告知编译器您打算进行转换的方法,并且您知道可能会发生数据丢失
狗是动物的一种特殊forms。 狗具有狗特有的属性和行为( bark
, lickPrivateParts
),但也具有Animal组的所有成员共同的属性和行为( numberOfChromosomes
, breathe
, eat
等)。
如果你将一只狗施放到动物身上,你正在向上倾斜 (将一个更专业的类别视为一个不太专业的基类)。 在转换为Animal时,编译器/运行时将“看到”狗作为基本动物和狗特有的属性和行为将不适用于这种最高速的狗 – 动物。 这是有道理的,因为,例如,一般动物不会’吠叫’。
在执行此操作时,您不是在创建新的Animal实例,而是使用Dog,就像它是一个不太专业的Animal对象一样。
同样,如果将位图转换为图像,您将(在您将位图视为图像的持续时间内)只能访问图像的字段/属性,而不能访问位图。
值得一提的是,您在示例中所做的是向下转换 (从较不专业化的对象转向更专业的对象)。 这并不总是安全或合理的 – 如果您考虑一下,Animal类的实例没有Dog特定属性的值或定义。
使用新的Obj()创建新对象时; 创建一个新对象。 将该对象转换为另一个对象类型时,该对象保持不变,只有运行时才能将该对象作为不同类型使用。
您可以将列表强制转换为IEnumerable,并使用与IEnumerable类型相同的列表对象进行工作。
这仅适用于 – 要转换为的对象是要转换的对象的基类。 – 要转换的对象实现要转换的接口。 – 对象为结果类型提供特定的强制转换。 (使用显式运算符)。
你在做什么看起来不明智! Bitmap
是Image
的子类,因此您始终可以获取Bitmap
对象并将其称为Image
,但不能保证任何特定Image
都是Bitmap
。 如果不是,您将最终抛出exception。
您可以从Image
创建一个新的Bitmap
,但您必须通过创建一个新实例来实现,例如
Image i = some image... Bitmap b = new Bitmap(i);
这不是强制转换,即创建一个新的Bitmap
对象,但是a)合法且b)合理。