匿名方法强制转换为指针

时间:2010-02-22 09:29:50

标签: delphi delphi-2010 anonymous-methods

任何人都可以解释为什么下面的代码失败了?

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;

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

在此处阅读更多内容:Anonymous methods in Delphi: the internals(由Stackoverflow用户Serg编写)。