You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 12.1中为何需要双重括号?解决E2036编译错误

Delphi 12.1中TValue.AsObject加括号解决编译错误的原因

以下代码在Delphi 12.1中无法编译:

program Project1;
  {$APPTYPE CONSOLE}

uses
  System.RTTI;

var
  Value: TValue;

begin
  TValue.Make (0, TypeInfo (TObject), Value);
  if not Assigned (Value.AsObject) then
    WriteLn ('NIL found.');

  ReadLn
end.

报错信息:

[dcc32 error] Project1.dpr(12): E2036 variable required

添加一对额外括号后,代码可正常编译运行并输出预期结果:

program Project1;
  {$APPTYPE CONSOLE}

uses
  System.RTTI;

var
  Value: TValue;

begin
  TValue.Make (0, TypeInfo (TObject), Value);
  if not Assigned ((Value.AsObject)) then
    WriteLn ('NIL found.');

  ReadLn
end.

输出结果:

NIL found.


这对括号的核心作用是将属性getter的返回值转换为可被Assigned函数接受的可寻址表达式,具体原因如下:

  • Assigned函数的参数是var修饰的Pointer类型,要求传入一个可寻址的变量(左值)——也就是能获取到内存地址的对象,它需要检查变量指向的地址是否为nil。
  • TValue.AsObject是属性的getter方法,它的返回值是临时生成的右值,没有固定内存地址,直接传给Assigned时,编译器找不到可寻址的变量,因此抛出"variable required"错误。
  • 括号(Value.AsObject)会触发编译器自动创建一个临时变量,把AsObject的返回值存入这个临时变量中。这个临时变量属于可寻址的左值,满足Assigned对参数的要求,因此可以正常编译。

内容的提问来源于stack exchange,提问作者Valerian K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 23:42:17