Ho un tipo generico non vincolato Atomic che implementa un inizializzatore (dettagli nel mio previous question).Creazione istanza di un oggetto basata su tipo generico non vincolato
type
Atomic<T> = class
type TFactory = reference to function: T;
class function Initialize(var storage: T; factory: TFactory): T;
end;
Ora voglio scrivere semplificato funzione Initialize che avrebbe preso le informazioni sul tipo di T (a condizione che typeof (T) è tkClass) e creare nuova istanza (quando necessario) con il costruttore di default.
Purtroppo, questo non funziona:
class function Atomic<T>.Initialize(var storage: T): T;
begin
if not assigned(PPointer(@storage)^) then begin
if PTypeInfo(TypeInfo(T))^.Kind <> tkClass then
raise Exception.Create('Atomic<T>.Initialize: Unsupported type');
Result := Atomic<T>.Initialize(storage,
function: T
begin
Result := TClass(T).Create; // <-- E2571
end);
end;
end;
compilatore segnala l'errore E2571 Type parameter 'T' doesn't have class or interface constraint
.
Come posso ingannare il compilatore per creare un'istanza di classe T?
Grazie, ma il nocciolo del problema con XE2 Update 2 è che TypeInfo (T) non verrà compilato se T non è contrassegnato con il vincolo 'classe'. – gabr
Non lo sapevo. È una "caratteristica" o un bug? – Linas
Non ne sono sicuro, ma temo sia una funzionalità. – gabr