2009-05-25 7 views
12

Je suis en train de mettre en œuvre clairement dans le code exemple suivant en Delphi 2009.Interfaces avec Génériques - Réglage à 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; 
... 

Je pouvais comprendre l'erreur de temps complie si « T » n'a pas été contraint. Mais puisque "T" doit être une interface, j'aurais pensé que cette syntaxe aurait travaillé.

Y a-t-il des possibilités pour définir FField sur NIL, afin que l'interface puisse être libérée?

Répondre

19

Au lieu de nil, vous devez utiliser le nouveau Default(T) qui renvoie la valeur par défaut pour le type de paramètre générique. Et pour les interfaces, il est

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

Generics dans D2009 présente de nombreux problèmes. La plupart d'entre eux sont censés être résolus dans la prochaine mise à jour, chaque fois qu'il sortira. On dirait que c'est l'un d'entre eux. Essayez de le signaler à QC, et jusque-là, cette solution est probablement votre meilleure solution de contournement. –

+1

Agréablement surpris de voir que le code de comptage de référence était également émis. –

+0

@RyanVanIderstine Je l'espère! un bon vieux FField: - nul l'émettra aussi. Notez que le problème est toujours présent dans D2010, corrigé dans DXE2 + (je n'ai pas DXE à portée de main). –

Questions connexes