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;

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

4

2 回答 2

5

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

@gabr:感谢您对我的博客的引用,但我应该建议首先阅读Stackoverflow 用户 Barry Kelly的博客作为更有效的信息来源。

于 2010-02-22T10:12:21.637 回答
4

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

在此处阅读更多信息:Delphi 中的匿名方法:内部结构(由 Stackoverflow 用户Serg编写)。

于 2010-02-22T09:35:24.260 回答