匿名方法转换为指针

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;

我曾认为匿名方法可以通过指针进行简单的转换和使用,但这似乎是一个错误的假设。同时,如果有任何解释匿名方法在幕后是如何实现的资源,那将非常棒。谢谢!
2个回答

5

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

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


2
参考计数对于列表应该能够正常工作,因为它的类型是 TList<(某些方法引用类型)>。如果泛型破坏了引用计数,即使是像 TList<string> 这样的简单情况也将变得无用。 - Barry Kelly

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接