温馨提示:本文翻译自stackoverflow.com,查看原文请点击:delphi - Compile time error in assignment statement
delphi

delphi - 赋值语句中的编译时错误

发布于 2020-04-14 17:20:43

我有以下代码:

TTimer(TimerList.Items[Row]) := TTimer.Create(Self);

当我运行程序时,出现以下错误:

unit1.pas(70,19)错误:无法将参数分配给

为什么会引发此错误,我该如何解决?

查看更多

提问者
DelPhi1
被浏览
78
J... 2020-02-04 04:16

您将在左侧包括一个显式类型转换- 可以允许变量使用,但这里Items是通过getter访问的属性,因此它不是变量,而是函数结果。如果需要,您可以在此处键入的唯一位置是作业右侧

我们不知道的类型TimerList,但是假设它是兼容类型,就像TList<TTimer>您可以直接分配它一样。

 TimerList.Items[Row] := TTimer.Create(Self);

如果列表或数组的元素具有不同的,兼容的但不是隐式类型可移植的类型,则您将对赋值的右侧进行类型转换以匹配期望的左侧类型。


如果是纯文本TObjectList(来自注释),则列表元素为plain TObject,因此TTimer可以将任何对象(包括)分配给上述列表元素。您需要进行类型转换的地方是另一种方式-将TObjectback 分配给TTimer变量:

var 
  LMyTimer : TTimer
begin
  LMyTimer := TTimer(TimerList.Items[someIndex]);

同样要注意,在与TTimer.Create(self)您一起创建对象时,要赋予self计时器对象所有权(可能是形式?)。通过将其放入a,TObjectList您还可以将该对象的所有权授予列表。两者都将在尝试释放对象时尝试释放对象-最后执行的任何操作都会导致崩溃,所以这是一个错误。

确定哪个对象将承担所有权责任并实施该责任-一个对象不应具有两个所有者!要么有TObjectList自己的计时器,并因此与创建它TTimer.Create(nil)使用留下的所有权(形式?) TTimer.Create(self)并使用一个普通的TList,而不是一个TObjectList

如果您使用的是Delphi的现代版本,则我强烈希望使用类型化的泛型列表TList<TTimer>TObjectList<TTimer>这样就完全不需要进行类型转换了。