У меня есть базовый класс 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
Хорошо, так как Ондрей указал, что это приведение из формы в круг, что недопустимо.Однако Ингвар отметил, что это работает:
Circle r5 = (Circle)((Rectangle)arr[2]);
Rectangle r6 = (Rectangle)((Circle)arr[0]);
, а это не
Circle r5 = (Circle)arr[2];
Rectangle r6 = (Rectangle)arr[0];
Спасибо за вашу помощь!