Приведение производного члена базового массива в c # - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть базовый класс 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];

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 01 апреля 2019
Circle r4 = (Circle)arr[2];

Компилятор не может применить явное приведение, поскольку он не может статически определить, что arr[2], на самом деле, хранит Rectangle.Для компилятора это Shape и, следовательно, (Circle)arr[2] - это приведение от Shape до Circle.

0 голосов
/ 01 апреля 2019

Вы приводите элемент массива Shape к Circle напрямую, это невозможно, потому что на самом деле ваш объект Rectangle. Попробуйте явное приведение:

Circle r4 = (Circle)((Rectangle)arr[2]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...