Delphi 带匿名过程的内联var错误?

Delphi 带匿名过程的内联var错误?,delphi,Delphi,代码如下: Procedure TMyForm.doAction; begin generateToken; VAR LToken := generatedToken; // Ltoken is set correctly to xxxxx //----- TThread.CreateAnonymousThread( procedure begin GetData(LToken); // << here L

代码如下:

Procedure TMyForm.doAction;
begin

    generateToken;
    VAR LToken := generatedToken; // Ltoken is set correctly to xxxxx

    //-----
    TThread.CreateAnonymousThread(
      procedure
      begin

        GetData(LToken); // << here LToken is empty !!

      end).Start;

end;

这是一个bug还是已知的限制?

Delphi 10.3.x中有一个编译器bug,匿名方法无法正确捕获内联变量

内联变量不适用于匿名方法

正如您已经提到的,10.3.x的解决方案是定义和使用局部变量,而不是使用内联变量

另一个解决方案是升级到10.4,在10.4中,使用匿名方法捕获内联变量已经得到纠正,现在它可以正确捕获内联变量,所以您可以使用原始代码

然而,10.4中的编译器中还有一个与捕获内联变量相关的额外错误。如果变量是托管类型(接口引用、字符串…),则它不会自动释放,并且会泄漏内存

这些变量必须在捕获它们的匿名方法末尾显式释放。例如,将nil分配给接口引用或将空字符串分配给字符串变量

内存泄漏:匿名方法捕获的内联接口不会被释放

是的,10.4中修复了编译器错误,我无法从中看出它是否已被修复或作为“预期行为”被拒绝。如果是后者,我可以证明编译器允许它但产生意外结果不是预期的行为。它应该在编译期间将其标记为错误,或者按预期工作(由用户而不是编译器开发人员)。@HeartWare它已修复为在中,现在可以正常工作并捕获内联变量。我知道,因为我已经用10.4验证了修复。此外,被拒绝作为预期行为的bug不会标记为已修复,而是标记为“不会修复”或“按预期工作”。“固定”意味着真的固定了。@DalijaPrasnikar:谢谢。“Denali GetIt Integration Build(27.0.36919.8487)的预期行为”这条评论让我感到困惑。@HeartWare这条评论仅仅说明了纠正了哪个构建错误。它是在开发阶段-预发布期间对开发人员和测试人员的反馈。当你有bug时,你有错误的行为,有些东西不能按预期工作。当bug修复后,您将获得正确的预期行为。我发布了一个答案,让未来的访问者更清楚地了解这个问题。
Procedure TMyForm.doAction;
Var LToken: ansiString;
begin
   ....
end;