匿名方法转换为指针
谁能解释为什么下面的代码失败?
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。
can anyone explain why the code below fails?
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;
I assumed anonymous methods can simply be casted and used around via pointers but that seems like a wrong assumption. Also, any resources explaining how the anonymous methods are implemented under the hood would be great. TIA.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您应该使用 PPointer(@aObserverFunc)^ 而不是 @aObserverFunc 以避免断言失败。
@gabr:感谢您对我的博客的引用,但我建议首先阅读 Stackoverflow 用户 Barry Kelly 博客作为更有效的信息来源。
You should use PPointer(@aObserverFunc)^ instead of @aObserverFunc to avoid the failed assert.
@gabr: thanks for ref to my blog, but I should recommend first to read the Stackoverflow user Barry Kelly blog as a more competent source of information.
匿名方法实际上是接口(更正确的是实现接口的对象)。
在这里阅读更多内容: Delphi 中的匿名方法:内部结构(由 Stackoverflow 用户 Serg 编写)。
Anonymous methods are actually interfaces (more correct - objects implementing an interface).
Read more here: Anonymous methods in Delphi: the internals (written by Stackoverflow user Serg).