2010-02-22 74 views
2

任何人都可以解釋爲什麼下面的代碼失敗?匿名方法投射爲指針

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

您應該使用PPointer(@aObserverFunc)^而不是@aObserverFunc來避免失敗的斷言。

@gabr:謝謝你的參考我的博客,但我應該首先推薦閱讀the Stackoverflow user Barry Kelly博客作爲一個更有能力的信息來源。

+1

該列表的引用計數應該工作,因爲它的類型是'TList <(某種方法引用類型)>'。如果引用計數與泛型相沖突,甚至像TList 這樣的微小案例也將毫無用處。 – 2010-02-22 17:12:17

+0

@Barry凱利:謝謝,我從帖子中刪除了我的疑惑。 – kludg 2010-02-22 17:58:17