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.
相关产品推荐
相关产品推荐

