これはおそらく、以下の前の質問に似ています/続きです。
Delphi XE3 で「E2382 インスタンス変数を使用してコンストラクタを呼び出すことはできません」と表示されるのはなぜですか?
今、私は同じコードで Delphi XE4 を試しています (上記の質問の解決策に従って、「コンストラクター」を「プロシージャー」に変更しました)。
今、ジェネリックリストにもこれらのものがあります。つまり、私は持っています
TCoordRect = object
public
function Something: Boolean;
end;
次に、これらのリストを関数パラメーターに入れます。これをループして、アイテムに直接アクセスしようとします。
function DoSomething(AList: TList<TCoordRect>): Boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to AList.Count - 1 do
begin
Result := Result or AList[i].Something; // <-- Here comes the compiler error!
end;
end;
これにより、コンパイラ エラー「E2036 変数が必要です」が発生します。ただし、直接アクセスしない場合、つまり、代わりにローカル変数を配置して最初に使用すると、機能します。
function DoSomething(AList: TList<TCoordRect>): Boolean;
var
i: Integer;
ListItem: TCoordRect;
begin
Result := False;
for i := 0 to AList.Count - 1 do
begin
ListItem := AList[i];
Result := Result or ListItem.Something; // <-- Now this compiles!
end;
end;
もう 1 つの「回避策」は、これらの「オブジェクト」タイプをすべて削除して「クラス」に変更することですが、なぜこれが以前のように機能しないのか興味がありますか? これも「コンパイラがモバイル開発に移行している」ということですか、それとももっと具体的な理由があるのでしょうか、それともバグなのでしょうか? ところで、私はこれを QC の問題として報告したので、そこから何かが生じるかどうかを確認します.