Delphi XE E2064 Left side cannot be assigned to 错误解决方法

本文介绍了在使用DelphiXE编译旧项目时遇到的E2064错误,该错误涉及到记录类型属性的赋值。作者探讨了从Delphi2009到XE版本中编译器的变更,导致的面向对象封装限制。文章列举了四种解决方法,包括改用字段、转换为类、指针赋值和使用临时变量。对于开发者来说,这是一篇关于Delphi语言特性和版本差异的实用教程。

Delphi XE E2064 Left side cannot be assigned to 错误解决方法

1. 起源

此问题源于[秋风人事档案管理系统]用Delphi XE重编译中所发现。

快十年了,当初Delphi 7所编写项目,想用Delphi XE重新编译,并打算做为Free软件发布,编译错误中发现此问题,感觉颇有些意思,遂记录下来,以做备忘。

自Delphi 2009之后我转做c#之WinForm界面开发,Delphi 2010之后未实际做过项目,因此至此才遇到此问题。

此时Delphi XE更新已至XE10版。因情结而不愿XE2之后的use方法,遂决定以Delphi XE做为工具,重整老项目。

而此问题简而言之,就是当记录体(record)做为属性出现时,其赋值可否问题。

 

2. 赋值

比如,我有一记录体属性如下(这里以TPoint说明问题,实际项目中为自定义记录体):

type
  TForm1 = class(TForm)
    btnTest: TButton;
    procedure btnTestClick(Sender: TObject);
  private
    { Private declarations }
    FPoint: TPoint;
  public
    { Public declarations }
    property Point: TPoint read FPoint write FPoint;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnTestClick(Sender: TObject);
begin
  //Point.X := 12; //如此赋值不成功,报错为Left side cannot be assigned to
  //Point.Y := 12;
  with 
在编程中,出现“a value cannot be assigned to variable or expression”这类错误通常表示尝试为一个无法被赋值的对象(如常量、不可变对象或非左值表达式)进行赋值操作。以下是几种常见情况及其原因: 1. **对常量进行赋值** 常量在定义后其值不能更改。例如,在Go语言中使用`const`关键字声明的常量是固定不变的,试图修改它将导致编译错误: ```go const PI = 3.14 PI = 3.1415 // 编译错误cannot assign to PI ``` 2. **对不可变对象进行赋值** 某些数据类型在创建后内容不可更改,例如字符串和某些结构体类型的实例。在Go中,字符串是不可变的,因此不能通过索引方式修改其中的字符: ```go s := "hello" s[0] = 'H' // 编译错误cannot assign to s[0] ``` 3. **对非左值(lvalue)表达式进行赋值** 左值是指可以出现在赋值操作左侧的表达式,通常代表一个具有内存地址的对象。右值则是临时性的值,不能作为赋值的目标。例如,函数调用的结果如果是临时值,则不能直接对其赋值: ```go func getValue() int { return 42 } func main() { getValue() = 10 // 编译错误:invalid assignment left-hand side } ``` 这类问题与rvalue的定义相关,即rvalue不是代表一个可标识的内存位置的对象,因此不能作为赋值的目标[^1]。 4. **类型断言后的变量绑定问题** 在Go语言中,使用类型断言时如果未正确绑定提取出的值到新变量,也可能导致赋值失败。虽然可以通过扩展形式的类型开关语句来解决这一问题,但在普通赋值过程中仍需确保目标变量是有效的左值: ```go var x interface{} = "hello" str, ok := x.(string) if ok { str = "world" // 合法赋值 } ``` 5. **参数传递方式不正确** 如果函数期望接收某个类型的指针以实现对原始数据的修改,而实际传入的是值本身,也会导致赋值失败。此时应采用按引用传递的方式(即传递指针),而非默认的按值传递方式: ```go func updateValue(val *int) { *val = 100 } func main() { a := 5 updateValue(&a) // 正确:传递a的地址 } ``` 上述示例说明了如何避免因传递大对象或不正确的参数类型而导致的赋值问题[^4]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值