2009-05-25 13 views
12

Sto cercando di implementare chiaro nel seguente codice di esempio in Delphi 2009.Interfacce con Generics - Impostazione di NIL

interface 
... 
    TFoo<T : IInterface> = class(TObject) 
    FField : T; 
    procedure Clear; 
    end; 
... 
implementation 
... 
procedure TFoo<T>.Clear; 
begin 
    // Line Below Results In 
    // E2010 Incompatible types: 'T' and 'Pointer' 
    FField := nil; 
end; 
... 

ho potuto capire l'errore di tempo complie se "T" non è stato costretto. Ma poiché "T" deve essere un'interfaccia, avrei pensato che questa sintassi avrebbe funzionato con .

C'è via per impostare FField su NIL, quindi l'interfaccia può essere rilasciata?

risposta

19

Invece di nil è necessario utilizzare il nuovo Default(T) che restituisce il valore predefinito per il tipo di parametro generico. E per le interfacce è nil

procedure TFoo<T>.Clear; 
begin 
    FField := Default(T); 
end; 
+0

Ci sono un sacco di problemi con i generici in D2009. La maggior parte di questi dovrebbe essere risolta nel prossimo aggiornamento, ogni volta che viene fuori. Sembra che questo sia uno di quelli. Prova a segnalarlo a QC e, fino a quel momento, questa soluzione è probabilmente la soluzione migliore. –

+1

Piacevolmente sorpreso di vedere che anche il codice di conteggio dei riferimenti è stato emesso. –

+0

@RyanVanIderstine Lo spero! un buon vecchio FField: - nil lo emetterà anche. Si noti che il problema è ancora presente in D2010, risolto in DXE2 + (non ho DXE a portata di mano). –