这个简单的程序无法编译.[用XE5和D10测试.]
program Project10;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.Classes;
function MakeProc: TThreadProcedure;
begin
Result := procedure begin end;
end;
begin
TThread.Queue(nil, MakeProc);
end.
Run Code Online (Sandbox Code Playgroud)
编译器报告错误
[dcc32错误] Project10.dpr(16):E2250没有可以使用这些参数调用的'Queue'的重载版本
在TThread.Queue通话中.
类TThread实现了两个Queue重载.
class procedure Queue(const AThread: TThread; AMethod: TThreadMethod); overload; static;
class procedure Queue(AThread: TThread; AThreadProc: TThreadProcedure); overload; static;
Run Code Online (Sandbox Code Playgroud)
我很确定我的代码应该匹配第二个重载.
我能找到的唯一解决方法是:
TThread.Queue(nil, procedure begin MakeProc; end);
Run Code Online (Sandbox Code Playgroud)
我做错了什么或这是编译错误?有没有比我丑陋的黑客更好的解决方法?
编译器显然认为你试图将MakeProc自己作为参数传递.您可以通过添加括号来告诉编译器您打算调用该函数,就像函数接受参数一样:
TThread.Queue(nil, MakeProc());
Run Code Online (Sandbox Code Playgroud)
你的解决方法似乎不起作用.它会编译并运行,但返回的函数MakeProc永远不会执行.相反,匿名方法包装 MakeProc将运行,调用MakeProc,然后丢弃该函数的结果.(由于函数的结果在您提供的代码中没有做任何事情,您可能没有注意到差异.)