よく分からない現象に出会ったので質問です。Delphi 10.4.2で以下のコードが l.List[0].a := 200; の行でコンパイルエラーになり、
TInner.bの定義を例えばStringにすればコンパイルできるようになる。取得アクセサのあるレコード型プロパティは
戻り値はコピー渡しなのでそのメンバに直接代入しても無意味でStringで通る方がおかしいのかもしれないけど、
Listは動的配列で参照渡しなので、List[0]のメンバの変更はTListの中身をきちんと変更できると考えるとよく分からない。
また、関係ないメンバに型パラメータを使っているかいないかでコンパイル可否が変わるのは意図した仕様ではない可能性を感じる。
なぜこうなるか、分かる人がいたら教えてください。
ちなみにb: Tのままコンパイル通すのは、無理矢理だけど PInteger(@l.List[0].a)^ := 200; とすればResultに200が返ります。
ListではなくItemsプロパティの場合は戻り値がコピーなのでこれでもできないんですよね。(コンパイルは通るけどResultに100が返る)

uses System.Generics.Collections;
type TOuter<T> = class
type TInner = record
a: integer;
b: T; //ここを b: String;に変えるとコンパイル可
end;
function Test: Integer;
end;
function TOuter<T>.Test: Integer;
var
l: TList<TInner>;
t: TInner;
begin
l := TList<TInner>.Create;
t.a := 100;
l.Add(t);
l.List[0].a := 200; //ここでコンパイルエラー(E2064 代入できない左辺値です)
Result := l[0].a;
l.Free;
end;