Il tuo codice non riesce a compilare perché il compilatore non può garantire al momento della compilazione della classe generica che esiste una possibile conversione a tutti i possibili T
.
Di fronte a
intf.Work(param);
nel metodo generico il compilatore ha bisogno di sapere come convertire param
-OleVariant
. E non può farlo. Questo è uno dei limiti dei generici rispetto ai modelli.
La soluzione più semplice per voi è quello di fare la conversione in fase di esecuzione con l'aiuto di TValue
dall'unità Rtti
.
procedure MyClass<T>.MyWork(param: T);
begin
intf.Work(TValue.From<T>(param).AsVariant);
end;
Ed ecco un programma di test di esempio per dimostrare che TValue
fa il lavoro:
program SO15113162;
{$APPTYPE CONSOLE}
uses
Rtti;
procedure Work(param: OleVariant);
begin
Writeln(param);
end;
type
MyClass<T> = class
class procedure MyWork(param: T);
end;
class procedure MyClass<T>.MyWork(param: T);
begin
Work(TValue.From<T>(param).AsVariant);
end;
begin
MyClass<Double>.MyWork(2.4);
MyClass<string>.MyWork('hello');
MyClass<Integer>.MyWork(-666);
Readln;
end.
uscita
2.4
hello
-666
fonte
2013-02-27 13:34:48
Perché oh perché è questa bella domanda avvicinarsi voti? Gli elettori guardano anche a cosa stanno votando? –
Non ti preoccupare, possiamo sempre riaprire :-) – Johan
@Johan Non avremmo dovuto. Queste code di revisione su SO sono semplicemente stupide. –