我有一段简单的代码,可以在 Delphi XE2 中编译,但不能在 XE3 中编译,我不知道为什么。我已将有问题的代码减少到一小部分,并想知道 Delphi 认为它有什么问题。尝试在 Delphi XE 2 中编译包含此单元的项目工作正常,但在 Delphi XE3(试用版)中,它会给出“[dcc32 Error] AffineTransform.pas(26): E2382 Cannot call constructors using instance variables”。我所知道的唯一“古怪”的事情是使用老式的“对象”类型,其中构造函数与真实对象(基于 TObject 的类实例)中的构造函数并不完全相同。
如果我用“过程”替换该对象中的“构造函数”一词,那么它可以编译正常,但为什么会这样,这是在我的代码中进行的正确更改吗?即,这是一个不会有任何影响的更改吗?对功能有影响吗?
unit AffineTransform;
interface
type
{ Rectangular area. }
TCoordRect = object
public
Left, Top, Right, Bottom: Real;
constructor CreatePos(ALeft, ATop, ARight, ABottom: Real);
procedure Include(AX, AY: Real);
end;
implementation
constructor TCoordRect.CreatePos(ALeft, ATop, ARight, ABottom: Real);
begin
Left := ALeft;
Top := ATop;
Right := ARight;
Bottom := ABottom;
end;
procedure TCoordRect.Include(AX, AY: Real);
begin
CreatePos(AX, AY, AX, AY)
end;
end.
最佳答案
对于这个传统的 Turbo Pascal 风格对象
,关键字构造函数
确实没有任何意义。尽管 object
构造函数确实有一些特殊处理,但这里绝对不需要这样做。这里无非是带有一些方法的记录
。
XE3 编译器已更改,因此它不再允许您在实例方法内调用 Self
上的构造函数。 class
和 object
都是如此。我没有看到任何有关为何进行此更改的文档。毫无疑问,随着时间的推移,它会渗出。
您的直接解决方案是将构造函数
替换为过程
。从长远来看,将其转换为记录
而不是对象
是有意义的。
我还建议您将该方法的名称更改为Initialize
。一些库设计者似乎选择在其记录上使用 Create 和 Free 方法。这导致了大量的代码被编写成这样:
ctx := TRttiContext.Create;
try
....
finally
ctx.Free;
end;
事实上,所有这些代码都是虚假的,可以简单地删除! TRttiContext
变量将自动初始化自身。
这种设计也设置了一个巨大的Heffalump Trap对于喜欢使用 FreeAndNil 的 Delphi 编码人员来说。将记录传递给 FreeAndNil
会导致一些有趣的烟花!
关于delphi - 为什么Delphi XE3给出 "E2382 Cannot call constructors using instance variables"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12953393/