当访问'对象'的通用列表项时,Delphi XE4给出了E2036

时间:2013-04-24 13:11:07

标签: delphi object compiler-errors delphi-xe4

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

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;

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

1 个答案:

答案 0 :(得分:3)

这是一个编译器错误,它存在于编译器的所有早期版本中。故障不仅限于XE4。提交质量控制报告是正确的答复。

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

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

顺便说一下,这确实是旧见新的情况。 Legacy Turbo Pascal对象和现代通用容器。你正在混合油和水!