一个奇怪的问题:Left side cannot be assigned to

ylm163net 2008-09-10 02:57:07
R_Rule=record
Name:string;
end;

T_Para = class
private
FRule: R_Rule;
public
property Rule: R_Rule read FRule write FRule;
end;

Para: T_Para;
...

Para.Rule.Name:='abc';
这一句编译通不过,编译程序的提示为:
Left side cannot be assigned to

希望指点迷津,为什么这样写就不能赋值?
...全文
1238 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuminghua 2008-09-10
  • 打赏
  • 举报
回复
讨论这个没什么意义, 就当是个bug
看看这个http://www.delphibbs.com/keylife/iblog_show.asp?xid=6094
ylm163net 2008-09-10
  • 打赏
  • 举报
回复
类返回的是地址,记录返回的是数据实例,这样,就算编译通过,也不是原先的那个了,如果通过指针访问,就不会有问题了
ylm163net 2008-09-10
  • 打赏
  • 举报
回复
有点想通了
jadeluo 2008-09-10
  • 打赏
  • 举报
回复
函数返回值是个类的话,编译可以通过的。
函数返回值是记录类型的话,编译通不过。


function BRule: T_Rule;
begin
end;

......

BRule.Name := '123';
ylm163net 2008-09-10
  • 打赏
  • 举报
回复
为了说明问题,我修改一下,重新贴出

R_Rule=record
Name:string;
end;

T_Rule=class
public
Name:string;
end;

T_Para = class
private
FRule: R_Rule;
FTRule:T_Rule;
public
property Rule: R_Rule read FRule write FRule;
property TRule: T_Rule read FTRule write FTRule;
end;

Para: T_Para;
...

Para.TRule.Name:='abc';
Para.Rule.Name:='abc';
这时候Para.TRule.Name:='abc';可以编译通过
但是Para.Rule.Name:='abc';却不能通过
编译程序的提示为:
Left side cannot be assigned to
ylm163net 2008-09-10
  • 打赏
  • 举报
回复
回8楼:
如果把R_Rule的类型改为
R_Rule=class
public
Name:string;
end;

以上的代码就可以编译通过,8楼的说法也不对

ylm163net 2008-09-10
  • 打赏
  • 举报
回复
回7楼:
如果
str:=Para.Rule.Name;
就不会出错,这说明访问不成问题,但是不能写入数据
jadeluo 2008-09-10
  • 打赏
  • 举报
回复
属性的读写应该看成都是由函数完成的, 所以不支持楼主的这种写法。

来一段类似的代码:


function ARule: R_Rule;
begin
end;

......

ARule.Name := 'abc'; //这样是不行的, 也是Left side cannot be assigned to错误
yuqianyi1974 2008-09-10
  • 打赏
  • 举报
回复
Para.Rule的属性是R_Rule型的,只能付给R_Rule型。
如果能访问Para.Rule.name用属性有何意义,编译器先进行检查,不复类型不允许操作
ylm163net 2008-09-10
  • 打赏
  • 举报
回复
我现在的问题,为什么通过属性就不行了?
ylm163net 2008-09-10
  • 打赏
  • 举报
回复
2,3楼的回答不正确,我试过,如果将FRule移到 public部分,如下所示
T_Para = class
private
public
FRule: R_Rule;
property Rule: R_Rule read FRule write FRule;
end;


Para.FRule.Name:='abc'
就可以
通过属性 Para.Rule.Name:='abc'
就不可以

注意
Para.FRule.Name:='abc'
Para.Rule.Name:='abc'
的区别

现在郁闷透了
jsweifen 2008-09-10
  • 打赏
  • 举报
回复
Para.FRule.Name:='abc';
ylm163net 2008-09-10
  • 打赏
  • 举报
回复
Para.Rule.Name
现在是对Name进行赋值
yuqianyi1974 2008-09-10
  • 打赏
  • 举报
回复
Rule是R_Rule类型,只能付给R_Rule类型的数值
yuqianyi1974 2008-09-10
  • 打赏
  • 举报
回复
应该这样写
var
zzz:R_Rule;
zzz.name:='abc';
Rule:=zzz;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧