You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
type
TSome = record
fX: integer := 1;
function GetX() := fX;
end;
function CastTo<T>(reference: object) := T(reference); // Если T заменить на TSome, то все нормально.
begin
Writeln('Без CastTo<T>:');
Writeln((new TSome()).GetX());
var a1 := new TSome();
Writeln(a1.GetX());
Writeln((new TSome()).fX);
var a2 := new TSome();
Writeln(a2.fX);
Writeln('С CastTo<T>:');
Writeln(CastTo&<TSome>(new TSome()).GetX()); // 0, вместо 1.
var a3 := CastTo&<TSome>(new TSome());
Writeln(a3.GetX());
Writeln(CastTo&<TSome>(new TSome()).fX);
var a4 := CastTo&<TSome>(new TSome());
Writeln(a4.fX);
end.
Минимизированный пример:
type
TSome = record
fX: integer := 1;
function Method() := fX;
end;
function CastTo<T>(reference: object) := T(reference);
begin
Writeln(CastTo&<TSome>(new TSome()).Method()); // 0, вместо 1.
end.
The text was updated successfully, but these errors were encountered:
Нет. Та серия характеризуется не только выводом мусора при работе с записями. Там всегда создавался лишний указатель, и использовался вместо значения. А тут что то другое, скорее всего с box связанное... Сейчас разберусь.
То есть, если писать всё на одной строчке - компилятор забывает создать указатель на полученное из CastTo значение, и выполняет Method для значения вместо указателя, отсюда мусор.
@MrSpecular это новый тип ошибки, он не связан с той древней цепочкой.
Минимизированный пример:
The text was updated successfully, but these errors were encountered: