[英]Casting a derived member of a base array in c#
我有一个带有两个派生类Circle
和Rectangle
的基类Shape
。 现在,我编写了从Rectangle
到Circle
显式转换,反之亦然。 他们没有多大意义,但这不是我现在的意思。 我创建了新的Rectangle
和Circle
实例,并希望通过强制转换将Rectangle
分配给Circle
。 那按预期工作。
但是,如果我有类型的数组Shape
,这是充满Rectangles
,想投一个数组的成员,它抛出一个System.InvalidCastException
。 正如我编写的显式转换一样,我不知道为什么这是不可能的。
Shape[] arr = new Shape[5];
Circle c1 = new Circle(1, 2, 3);
Circle c2 = new Circle(4, 5, 6);
Rectangle r1 = new Rectangle(7, 8);
Rectangle r2 = new Rectangle(9, 10);
Shape c3 = new Circle(3, 9, 13);
arr[0] = c1;
arr[1] = c2;
arr[2] = r1;
arr[3] = r2;
arr[4] = c3;
Console.WriteLine(r1.GetType());
Console.WriteLine(arr[2].GetType()); // both evalute to Rectangle
Circle r3 = (Circle)r1; // compiles
Circle r4 = (Circle)arr[2]; // Unhandled Exception
好的,正如Ondrej指出的那样,这是从形状到圆的强制转换,这是不允许的。 但是,ingvar指出这可行:
Circle r5 = (Circle)((Rectangle)arr[2]);
Rectangle r6 = (Rectangle)((Circle)arr[0]);
而且这不
Circle r5 = (Circle)arr[2];
Rectangle r6 = (Rectangle)arr[0];
谢谢你的帮助!
Circle r4 = (Circle)arr[2];
编译器无法应用显式强制转换,因为它不能静态确定arr[2]
实际上存储了Rectangle
。 对于编译器,它是Shape
,因此(Circle)arr[2]
是从Shape
到Circle
。
您将Shape
数组的元素直接转换为Circle
,这是不可能的,因为实际上您的对象是Rectangle
。 尝试显式强制转换:
Circle r4 = (Circle)((Rectangle)arr[2]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.