为了账号安全,请及时绑定邮箱和手机立即绑定

在 C# 中转换基本数组的派生成员

在 C# 中转换基本数组的派生成员

C#
慕虎7371278 2022-11-21 21:26:59

我有一个Shape包含两个派生类的基类Circle和Rectangle. 现在我已经编写了从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];

谢谢你的帮助!


查看完整描述

2 回答

?
HUWWW

TA贡献1584条经验 获得超1个赞

Circle r4 = (Circle)arr[2];

编译器无法应用显式强制转换,因为它无法静态确定arr[2]实际上存储了一个Rectangle. 对于编译器,它是Shape并且因此(Circle)arr[2]是从Shape到的转换Circle


查看完整回答
反对 回复 2022-11-21
?
青春有我

TA贡献1504条经验 获得超8个赞

您将Shape数组的元素Circle直接转换为,这是不可能的,因为实际上您的对象是Rectangle. 尝试显式转换:

Circle r4 = (Circle)((Rectangle)arr[2]);


查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 9 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信