为什么我的通用匿名方法不兼容?

mad*_*mad 3 delphi generics anonymous-methods delphi-2010

在我的学习过程中,我使用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;
Run Code Online (Sandbox Code Playgroud)

以下是我尝试使用上述代码的方法:

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;
Run Code Online (Sandbox Code Playgroud)

编译错误:

[DCC Error] uMain.pas(36): E2010 Incompatible types: 'TProc<ugrsObj.Using<T>.T>' and 'Procedure'
Run Code Online (Sandbox Code Playgroud)

Ste*_*nke 8

这是因为Delphi中的类型推断很差.它实际上可以T从第一个参数推断,但遗憾的是编译器不满足于完全匹配的第二个参数.

您必须显式声明类型参数,如下所示:

TgrsObj.Using<TStringStream>(TStringStream.Create, procedure(ss: TStringStream)
  begin
    ss.WriteString('test string');
    Memo1.Lines.Text := ss.DataString;
  end);
Run Code Online (Sandbox Code Playgroud)