gpt4 book ai didi

Delphi XE4 在访问 'object' 的通用列表项时给出 E2036

转载 作者:行者123 更新时间:2023-12-03 15:54:49 25 4
gpt4 key购买 nike

这可能与下面的上一个问题类似/延续:

Why Delphi XE3 gives "E2382 Cannot call constructors using instance variables"?

现在我正在尝试使用相同的代码(根据上述问题的解决方案将“构造函数”更改为“过程”)。

现在我在泛型列表中也有这些东西,即我有

TCoordRect = object
public
function Something: Boolean;
end;

然后是函数参数中的这些列表,我循环遍历并尝试直接访问这些项目:

function DoSomething(AList: TList<TCoordRect>): Boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to AList.Count - 1 do
begin
Result := Result or AList[i].Something; // <-- Here comes the compiler error!
end;
end;

这会产生编译器错误“E2036 需要变量”。但是,如果我不直接访问它,即放置一个局部变量并首先使用它,那么它就可以工作:

function DoSomething(AList: TList<TCoordRect>): Boolean;
var
i: Integer;
ListItem: TCoordRect;
begin
Result := False;
for i := 0 to AList.Count - 1 do
begin
ListItem := AList[i];
Result := Result or ListItem.Something; // <-- Now this compiles!
end;
end;

另一个“解决方法”是删除所有这些“对象”类型并将它们更改为“类”,但我很好奇为什么这不像以前那样工作?是否又只是“编译器转向移动开发”,或者是否有一些更具体的原因,或者这甚至是一个错误?顺便说一句,我也将此报告为质量控制问题,所以会看看是否有东西来自那里。

最佳答案

这是一个编译器错误,它存在于所有早期版本的编译器中。该故障不仅限于XE4。提交 QC 报告是正确的回应。

如果 Embarcadero 从未尝试修复它,我不会感到惊讶。那是因为您使用的是已弃用的对象。切换到使用 record 代码即可编译。

您在此问题中发现的问题与您在问题顶部提到的 SO 问题无关。

顺便说一句,这确实是一个新旧相遇的例子。传统的 Turbo Pascal 对象和现代的通用容器。你正在混合油和水!

关于Delphi XE4 在访问 'object' 的通用列表项时给出 E2036,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16192934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com