2009-05-25 15 views
12

estoy tratando de poner en práctica clara en el siguiente ejemplo de código en Delphi 2009.Interfaces con los genéricos - Ajuste a 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; 
... 

pude comprender el error de tiempo complie si no se ha limitado "T". Pero dado que "T" debe ser una interfaz, habría pensado que esta sintaxis tendría trabajado.

¿Existe alguna posibilidad de establecer FField en NIL, por lo que la interfaz puede ser liberada?

Respuesta

19

En lugar de nil debe usar el nuevo Default(T) que devuelve el valor predeterminado para el tipo de parámetro genérico. Y para las interfaces es nil

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

Hay muchos problemas con los genéricos en D2009. Se supone que la mayoría de ellos se resolverán en la próxima actualización, cada vez que se publique. Parece que este es uno de ellos. Intente informarlo al control de calidad, y hasta entonces, esta solución es probablemente su mejor solución. –

+1

Agradablemente sorprendido de ver que también se emitió el código de conteo de referencia. –

+0

@RyanVanIderstine ¡Eso espero! un buen viejo FField: - nil también lo emitirá. Tenga en cuenta que el problema persiste en D2010, corregido en DXE2 + (no tengo DXE a mano). –

Cuestiones relacionadas