在我的学习过程中,我使用 Nick Hodges 的《Coding in Delphi》一书。我正在使用Delphi 2010。
在有关匿名方法的章节中,他提供了一个关于使用伪造 .NET
的非常有趣的示例。当我尝试编译该示例时,编译器出现错误。请帮我得到结果。
我的类(class):
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'
最佳答案
这是因为 Delphi 中的类型推断很差。事实上,它可以从第一个参数推断出 T
,但不幸的是,编译器并不满足于完美匹配的第二个参数。
您必须像这样显式声明类型参数:
TgrsObj.Using<TStringStream>(TStringStream.Create, procedure(ss: TStringStream)
begin
ss.WriteString('test string');
Memo1.Lines.Text := ss.DataString;
end);
关于delphi - 为什么我的通用匿名方法类型不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23581241/