3

以下のコードが失敗する理由を誰か説明できますか?

type TIDEThemeObserverFunc = reference to procedure(foo: integer);
var fObserverFuncs: TList<TIDEThemeObserverFunc>

function RegisterEventObserver(aObserverFunc: TIDEThemeObserverFunc): Pointer;
begin
  fObserverFuncs.Add(aObserverFunc);
  Result := @aObserverFunc;

  // line below somehow fails
  assert(fObserverFuncs.IndexOf(TIDEThemeObserverFunc(Result)) <> -1);
end;

匿名メソッドは単純にキャストしてポインターを介して使用できると想定していましたが、それは間違った想定のようです。また、匿名メソッドが内部でどのように実装されているかを説明しているリソースは素晴らしいでしょう。ティア。

4

2 に答える 2

5

失敗したアサートを回避するには、@aObserverFunc の代わりに PPointer(@aObserverFunc)^ を使用する必要があります。

@gabr: 私のブログへの参照に感謝しますが、より有能な情報源として、まず Stackoverflow ユーザーの Barry Kellyブログを読むことをお勧めします。

于 2010-02-22T10:12:21.637 に答える
4

匿名メソッドは実際にはインターフェイスです (より正確には、インターフェイスを実装するオブジェクト)。

詳しくは、Delphi の匿名メソッド: 内部(Stackoverflow ユーザーSergによる記述) を参照してください。

于 2010-02-22T09:35:24.260 に答える