找不到TThread.Queue过载

gab*_*abr 3 delphi

这个简单的程序无法编译.[用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)

我做错了什么或这是编译错误?有没有比我丑陋的黑客更好的解决方法?

Rob*_*edy 8

编译器显然认为你试图将MakeProc自己作为参数传递.您可以通过添加括号来告诉编译器您打算调用该函数,就像函数接受参数一样:

TThread.Queue(nil, MakeProc());
Run Code Online (Sandbox Code Playgroud)

你的解决方法似乎不起作用.它会编译并运行,但返回的函数MakeProc永远不会执行.相反,匿名方法包装 MakeProc将运行,调用MakeProc,然后丢弃该函数的结果.(由于函数的结果在您提供的代码中没有做任何事情,您可能没有注意到差异.)