Рассмотрим следующее:
{$APPTYPE CONSOLE}
uses
Generics.Collections;
type
TObjProc = procedure of object;
TFoo = class
public procedure DoFoo;
public procedure DoBar;
end;
procedure TFoo.DoFoo;
begin
WriteLn('foo');
end;
procedure TFoo.DoBar;
begin
WriteLn('bar');
end;
var
ProcList : TList<TObjProc>;
Foo : TFoo;
aProc : TObjProc;
begin
Foo := TFoo.Create;
ProcList := TList<TObjProc>.Create;
ProcList.Add(Foo.DoFoo);
ProcList.Add(Foo.DoBar);
for aProc in ProcList do aProc;
ReadLn;
end.
Это дает ожидаемый результат
foo
bar
Теперь предположим, что мы хотим назначить процедуру из списка. Перечисление работает, как указано выше. Это также работает:
aProc := ProcList.Items[0];
aProc;
Но это вызывает ошибку компилятора:
aProc := ProcList.First;
// E2010 Incompatible types:
//'procedure, untyped pointer or untyped parameter' and 'TObjProc'
Что вдвойне нечетно, так как
function TList<T>.First: T;
begin
Result := Items[0];
end;
Итак... что происходит?
Это влияет и на более новые версии Delphi? Я соблазн QC, если есть разумное ожидание, что это должно сработать (что, я думаю, есть).