3

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

为什么 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 问题,因此将看看是否有什么来自那里。

4

1 回答 1

3

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

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

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

顺便说一句,这真的是一个新旧结合的案例。旧版 Turbo Pascal 对象和现代通用容器。你在混合油和水!

于 2013-04-24T13:17:35.613 回答