Типы записей являются типами значений;Для простого случая, давайте предположим, что вы используете цикл for in
над TList<TRecordType>
.Поскольку итератор является функцией, он вернет копию записи в списке.Изменение этой copy не влияет на запись в списке;Даже если компилятор позволил вам сделать это, как это было в более старых версиях Delphi, результат не будет таким, как вы ожидаете.
Представьте себе функцию, возвращающую простой Integer
(также тип значения).Вы никогда бы не подумали о написании такого кода, потому что интуиция говорит вам, что это не имеет смысла:
function aFunc(aParam:Integer): Integer;
begin
Result := 7;
end;
procedure Test;
begin
aFunc(8) := 9; // This doesn't compile and intuition tells you it's *very* wrong.
end;
... но ситуация с записью такая же.Представьте себе этот пример:
type TTestRecord = record
aField: Integer;
end;
function TestFunc: TTestRecord;
begin
Result.aField := 9;
end;
procedure TestProc;
begin
TestFunc.aField := 10; // This also doesn't make any sense, but intuition might
// fail on this one. Older versions of the compiler allowed this!
end;
Ситуация такая же с циклом for in
.Сам итератор использует свойство, которое, скорее всего, реализовано с помощью функции.Поскольку изменение результата функции не имеет большого смысла, и, учитывая, что изменение не будет распространено обратно туда, где значение получено итератором, компилятор очень хорошо останавливает его!