匿名方法强制转换为指针

utk*_*tas 3 delphi anonymous-methods delphi-2010

有谁可以解释为什么下面的代码失败?

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;
Run Code Online (Sandbox Code Playgroud)

我假设匿名方法可以简单地通过指针进行转换和使用,但这似乎是一个错误的假设.此外,任何解释如何在引擎盖下实现匿名方法的资源都会很棒.TIA.

klu*_*udg 5

您应该使用PPointer(@aObserverFunc)^而不是@aObserverFunc来避免失败的断言.

@gabr:感谢您参考我的博客,但我建议您首先阅读Stackoverflow用户Barry Kelly博客作为更有说服力的信息来源.

  • 列表的引用计数应该有效,因为它的类型是`TList <(某种方法引用类型)>`.如果引用计数与泛型有关,即使是像TList <string>这样的小事也无济于事. (2认同)