Rozważmy następujący:Generics nie metoda rozwiązywania typów prawidłowo
{$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.
To daje oczekiwane wyjście
foo
bar
Załóżmy teraz chcemy przypisać procedurę z listy. Wyliczanie dzieł, jak wyżej. Działa to również:
aProc := ProcList.Items[0];
aProc;
Ale to generuje błąd kompilatora:
aProc := ProcList.First;
// E2010 Incompatible types:
//'procedure, untyped pointer or untyped parameter' and 'TObjProc'
Która jest podwójnie dziwne ponieważ
function TList<T>.First: T;
begin
Result := Items[0];
end;
Więc ... co się dzieje?
Czy to dotyczy również nowszych wersji Delphi? Kusi mnie to QC, jeśli istnieje uzasadnione oczekiwanie, że to powinno zadziałać (co moim zdaniem jest).
Z C#, C, C++, Python i każdego innego języka. Oprócz VB. Zawsze jest źle, gdy znajdziesz się w zestawie o rozmiarze drugim, a innym członkiem jest VB! –
AFAIK, Swift, a więc staje się zestawem trzech. –