type
a = class
x, y: Integer;
end;
b = class(a)
z: Integer;
end;
var
s: array[1..2] of a;
begin
s[1] := new a;
s[2] := new b;
foreach u: b in s do
write(u.z);
end.
при компиляции выдает ошибку в строке foreach:
test.pas(19) : Нельзя преобразовать тип a к b
Год назад, такая конструкция компилировалась и работала. Сейчас нет.
Это понятно, но ведь как удобно было и как хорошо работало. А теперь придется огород городить для того, чтобы выбрать нужные объекты в массиве и сделать с ними действия.
Кстати, а почему Вы говорите о неявном преобразовании. Ранее работало иначе. Из массива выбирались только те данные, которые соответствовали типу. А если так, то о каком преобразовании идет речь?
Возможно это Вам и удобно, когда кривой код работает, но быть этого не должно.
Паскаль имеет жесткую типизацию; Вы определили в заголовке foreach переменную u типа b, компилятор пытается сгенерировать код для поочередного размещения в u элементов массива s, для чего выполняет присваивание b:=<элемент массива s>. Ничего удивительного, что компилятор не может “преобразовать тип a к b”.
Конечно, ничего удивительного. Сам в свое время удивился крутизне компилятора. Как он так делал и при этом правильно работал.
Возможно, Вы сумеете объяснить, как раньше работало? Было бы познавательно.