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

为何无法将string类型的类属性传递给带var参数的函数?

错误原因分析

你遇到的E2197 Constant object cannot be passed as var parameter错误,核心问题出在类属性和普通变量的本质差异:

  • 你的Lname属性依赖GetLname和SetLname访问器方法实现。当你写FMyClass.Lname时,实际是调用GetLname返回一个临时字符串副本,而非直接指向类内部的FLname字段。
  • Writeteststr的var newString参数要求传入可修改的左值(有固定内存地址的实际变量),函数会直接修改该变量的存储内容。但临时副本属于"常量对象",没有可持久修改的存储位置——就算函数修改了临时值,也无法同步回类的属性,完全没有意义,因此编译器会直接阻止这种操作。
解决方法

方法一:临时变量中转(推荐,保持封装性)

先把属性值读取到临时变量,传给函数修改后,再将变量值写回属性:

var
  TempLName: string;
begin
  TempLName := FMyClass.Lname;
  Writeteststr(TempLName);
  FMyClass.Lname := TempLName;
end;

方法二:简化属性访问(仅适用于无自定义get/set逻辑的场景)

如果GetLname和SetLname只是简单读写FLname字段,没有额外业务逻辑,可以把属性改成直接绑定字段,这样FMyClass.Lname会直接指向FLname变量,就能作为var参数传递:

Type
  MyClass = class
  private
    FLname  : String;
  public
    ...
    property Lname: string read FLname write FLname;
  end;

方法三:修改函数参数类型(如果不需要修改原始值)

如果Writeteststr仅需读取字符串内容、无需修改,可以去掉参数的var关键字,直接传属性值:

function Writeteststr(newString: string) : Boolean;
begin
  // 字符串处理逻辑
end; 

内容的提问来源于stack exchange,提问作者Franz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:12:32