3

これはおそらく、以下の前の質問に似ています/続きです。

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 の問題として報告したので、そこから何かが生じるかどうかを確認します.

4

1 に答える 1

3

これはコンパイラのバグであり、以前のすべてのバージョンのコンパイラに存在します。障害は XE4 に限定されません。QCレポートを提出するのが正しい対応です。

Embarcadero がそれを修正しようとしなかったとしても、私は驚かないでしょう。これは、 deprecated を使用しているためですobject。using に切り替えるrecordと、コードがコンパイルされます。

この質問で明らかにした問題は、質問の上部で参照している SO の質問とは無関係です。

ちなみに、これはまさに新旧の出会いです。従来の Turbo Pascal オブジェクトと、最新の汎用コンテナー。油と水が混ざっている!

于 2013-04-24T13:17:35.613 に答える