这可能与以下上一个问题类似/延续:
为什么 Delphi XE3 给出“E2382 无法使用实例变量调用构造函数”?
现在我正在尝试使用相同代码的Delphi XE4(根据上述问题的解决方案,“构造函数”更改为“过程”)。
现在我在泛型列表中也有这些东西,即我有
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;
另一个“解决方法”是删除所有这些“对象”类型并将它们更改为“类”,但我很好奇为什么这不像以前那样工作?还是只是“编译器转向移动开发”还是有一些更具体的原因,或者这甚至是一个错误?顺便说一句,我也将此报告为 QC 问题,因此将看看是否有什么来自那里。