Анонимные методы приводятся как указатели - PullRequest
3 голосов
/ 22 февраля 2010

Может кто-нибудь объяснить, почему код ниже не работает?

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 голосов
/ 22 февраля 2010

Вы должны использовать PPointer (@aObserverFunc) ^ вместо @aObserverFunc, чтобы избежать ошибочного утверждения.

@ gabr: спасибо за ссылку на мой блог, но я должен рекомендовать сначала прочитать блог пользователя Stackoverflow Барри Келли как более компетентный источник информации.

4 голосов
/ 22 февраля 2010

Анонимные методы - это на самом деле интерфейсы (вернее - объекты, реализующие интерфейс).

Подробнее здесь: Анонимные методы в Delphi: внутренние компоненты (написано пользователем Stackoverflow Serg ).

...