Anonymous methods cast as pointers
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)) <&g开发者_运维知识库t; -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.
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.
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).
精彩评论