Si consideri il seguente:Generics non risolvere i tipi di metodo correttamente
{$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.
Questo produce il risultato atteso di
foo
bar
Ora supponiamo di voler assegnare un procedimento dalla lista. Enumerazione dei lavori, come sopra. Questo funziona anche:
aProc := ProcList.Items[0];
aProc;
Ma questo getta un errore di compilazione:
aProc := ProcList.First;
// E2010 Incompatible types:
//'procedure, untyped pointer or untyped parameter' and 'TObjProc'
Quale è doppiamente strano dato
function TList<T>.First: T;
begin
Result := Items[0];
end;
Allora ... cosa sta succedendo?
Questo influisce anche sulle versioni più recenti di Delphi? Sono tentato di QC questo se c'è una ragionevole aspettativa che questo dovrebbe funzionare (che credo ci sia).
Da C#, C, C++, Python e ogni altra lingua. Oltre a VB. È sempre brutto quando ti trovi in un set di taglia due e l'altro membro è VB !! –
E, AFAIK, Swift, quindi diventa un set di tre. –