这可能与上一个问题类似/延续:
Why Delphi XE3 gives "E2382 Cannot call constructors using instance variables"?
现在我正在尝试使用相同代码的Delphi XE4(根据上述问题的解决方案将'constructor'更改为'procedure')。
现在我在泛型列表中也有这些东西,即我有
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 Variable required”。但是,如果我不直接访问它,即改为使用局部变量并首先使用它,那么它可以工作:
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;
另一个“解决方法”是删除所有这些“对象”类型并将它们更改为“类”,但我很好奇为什么它不像以前那样工作?它是否只是“编译器正朝着移动开发方向发展”或者是否有更具体的原因,或者这甚至是一个错误?顺便说一句,我也将此报告为质量控制问题,因此可以看看是否有来自那里的东西。
答案 0 :(得分:3)
这是一个编译器错误,它存在于编译器的所有早期版本中。故障不仅限于XE4。提交质量控制报告是正确的答复。
如果Embarcadero从未试图修复它,我不会感到惊讶。那是因为您使用的已弃用object
。切换到使用record
并编译代码。
您在此问题中发现的问题与您在问题顶部提到的SO问题无关。
顺便说一下,这确实是旧见新的情况。 Legacy Turbo Pascal对象和现代通用容器。你正在混合油和水!