Delphi 匿名方法强制转换为指针

Delphi 匿名方法强制转换为指针,delphi,delphi-2010,anonymous-methods,Delphi,Delphi 2010,Anonymous Methods,有人能解释为什么下面的代码失败吗 type TIDEThemeObserverFunc = reference to procedure(foo: integer); var fObserverFuncs: TList<TIDEThemeObserverFunc> function RegisterEventObserver(aObserverFunc: TIDEThemeObserverFunc): Pointer; begin fObserverFuncs.Add(aObs

有人能解释为什么下面的代码失败吗

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;
type tidesethemeobserverfunc=对过程的引用(foo:integer);
var fObserverFuncs:TList
函数寄存器eventobserver(aObserverFunc:tidesethemeobserverfunc):指针;
开始
添加(aObserverFunc);
结果:=@aObserverFunc;
//下面的一行不知怎的失败了
assert(fObserverFuncs.IndexOf(TIDEThemeObserverFunc(Result))-1);
结束;

我假设匿名方法可以简单地通过指针进行转换和使用,但这似乎是一个错误的假设。此外,任何解释匿名方法是如何在后台实现的资源都将非常有用。TIA.

匿名方法实际上是接口(更正确的说法是——实现接口的对象)

此处阅读更多内容:(由Stackoverflow用户编写)。

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


@gabr:感谢您对我博客的引用,但我建议您首先将博客作为一个更有效的信息来源来阅读。

列表的引用计数应该有效,因为它属于
TList
类型。如果引用计数与泛型相冲突,那么即使是像
TList
这样的琐碎案例也将毫无用处。