【问题标题】:Delphi XE4 gives E2036 when accessing generic list items of 'object'sDelphi XE4 在访问“对象”的通用列表项时给出 E2036
【发布时间】:2013-04-24 13:11:06
【问题描述】:

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

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

现在我正在尝试使用相同代码的 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 问题,因此将看看是否有什么来自那里。

【问题讨论】:

    标签: delphi object compiler-errors delphi-xe4


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我不确定在 Delphi 中恢复 object 类型是否真的是遗留
    • 关于“所有早期版本”——相同的代码在 XE3 和 XE2 上编译没有错误。如果他们不解决这个问题,我也不会感到惊讶,我同意这是一个新旧结合的案例,有点乞求问题:)。与另一个问题的关系主要是因为它基于相同的代码,所以,我想这取决于你定义的关系,对我来说它是相关的。附:如果我从任何地方得到比“编译器错误”更内部的答案,那么我会接受,否则我会接受你的答案:)
    • @DelphiUser 不适合我。代码以与 2010、XE2、XE3 和 XE4 完全相同的方式失败。另一个问题与object 上的构造函数有关,而这个问题与泛型编译器错误有关。
    • @user539484 docwiki.embarcadero.com/RADStudio/XE4/en/… "支持对象类型只是为了向后兼容。不建议在 Win32 上使用它们。"我认为这是遗产。
    • 油和水(或任何两种通常不混溶的流体)的混合物称为乳液。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多