2014-05-10 4 views
3

내 공부 과정에서 나는 Nick Hodges가 쓴 "Delphi에서 코딩"책을 사용합니다. Delphi 2010을 사용하고 있습니다.왜 일반 익명 메서드가 호환되지 않는 형식을 사용합니까?

익명 메소드에 관한 장에서는 .NET using을 위조하는 것에 대한 매우 흥미로운 예제를 제공합니다. 예제를 컴파일하려고하면 컴파일러에서 오류가 발생합니다. 결과를 얻도록 도와주세요.

내 클래스 :

여기
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; 

내가 위의 코드를 사용하려고하는 방법입니다 :

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; 

컴파일러 오류 : 델파이 형식 유추가

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

버그처럼 보이는 :

명시 적으로이 같은 유형의 매개 변수를 명시해야합니다. D2010 제네릭은 꽤 절름발이였습니다. –

답변

8

입니다 때문에 가난한. 사실 T은 첫 번째 매개 변수에서 유추 할 수 있지만 불행하게도 완벽하게 일치하는 두 번째 매개 변수에 대해서는 컴파일러가 만족스럽지 않습니다.

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

고마워. 그것은 나를 위해 그렇게 작동합니다. – mad