2014-05-10 1 views
3

Dans mon processus d'étude, j'utilise le livre "Coding in Delphi" de Nick Hodges. J'utilise Delphi 2010.Pourquoi ai-je un type incompatible générique de méthode anonyme?

Dans le chapitre sur les méthodes anonymes, il fournit un exemple très intéressant sur la fausseté .NET using. Lorsque j'essaie de compiler l'exemple, j'obtiens une erreur du compilateur. Aidez-moi s'il vous plaît à obtenir un résultat.

Ma classe:

type 
    TgrsObj = class 
    class procedure Using<T: class>(O: T; Proc: TProc<T>); static; 
    end; 

implementation 

{ TgrsObj } 

class procedure TgrsObj.Using<T>(O: T; Proc: TProc<T>); 
begin 
    try 
    Proc(O); 
    finally 
    O.Free; 
    end; 
end; 

Voici comment j'essaie d'utiliser le code ci-dessus:

procedure TForm4.Button1Click(Sender: TObject); 
begin 
    TgrsObj.Using(TStringStream.Create, 
    procedure(ss: TStringStream) 
    begin 
     ss.WriteString('test string'); 
     Memo1.Lines.Text := ss.DataString; 
    end); 
end; 

erreur du compilateur:

[DCC Error] uMain.pas(36): E2010 Incompatible types: 'TProc<ugrsObj.Using<T>.T>' and 'Procedure' 
+1

On dirait un bug. Les génériques de D2010 étaient plutôt boiteux. –

Répondre

8

C'est parce que l'inférence de type Delphi est pauvre. Il pourrait en effet inférer T du premier paramètre mais malheureusement le compilateur n'est pas satisfait alors pour le deuxième paramètre qui serait parfaitement assorti.

Vous devez indiquer explicitement le paramètre de type comme ceci:

TgrsObj.Using<TStringStream>(TStringStream.Create, procedure(ss: TStringStream) 
    begin 
    ss.WriteString('test string'); 
    Memo1.Lines.Text := ss.DataString; 
    end); 
+0

merci beaucoup. Cela fonctionne pour moi. – mad

Questions connexes