在我的学习过程中,我使用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'
答案 0 :(得分:8)
这是因为Delphi中的类型推断很差。实际上它可以从第一个参数推断T
,但遗憾的是编译器不满足第二个完全匹配的参数。
您必须明确说明类型参数,如下所示:
TgrsObj.Using<TStringStream>(TStringStream.Create, procedure(ss: TStringStream)
begin
ss.WriteString('test string');
Memo1.Lines.Text := ss.DataString;
end);