Delphi XE3中E2382错误为何禁止实例变量直接调用构造函数?

2026-04-10 19:192阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计563个文字,预计阅读时间需要3分钟。

Delphi XE3中E2382错误为何禁止实例变量直接调用构造函数?

我有一段简短的代码,在Delphi XE2中编译无误,但在XE3中编译时出现问题。我已将有问题代码减少到最小化,但仍想了解Delphi认为存在什么问题。尝试在Delphi XE2中编译包含此单元素的程序工。

我有一段简单的代码,在Delphi XE2中编译但在XE3中编译,我不知道为什么.我已经将有问题的代码减少到一点点,并且想知道Delphi认为它有什么问题.尝试在Delphi XE 2中编译包含此单元的项目工作正常,但在Delphi XE3(试用版)中,它给出了“[dcc32 Error] AffineTransform.pas(26):E2382无法使用实例变量调用构造函数”.我所知道的唯一“古怪”的东西是使用旧式的“对象”类型,其中构造函数与真实对象(基于TObject的类实例)实际上并不完全相同.

如果我用’procedure’替换这个对象中的’constructor’,那么它编译好了,但是为什么这样,这是我的代码中的一个好的改变,即它是一个不会对功能?

Delphi XE3中E2382错误为何禁止实例变量直接调用构造函数?

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样式对象,关键字构造函数实际上没有任何意义.虽然对象构造函数确实有一些特殊处理,但这里绝对没有必要.这里有什么只不过是一些方法的记录.

XE3编译器已更改,因此它不再允许您在实例方法内调用Self上的构造函数.类和对象都是这种情况.我没有看到任何关于为何进行此更改的文档.毫无疑问它会及时渗出.

您的直接解决方案是用过程替换构造函数.从长远来看,将其转化为记录而不是对象是有意义的.

我还会理解您将方法的名称更改为Initialize.一些图书馆设计师似乎选择在他们的记录上使用Create和Free方法.这导致了大量的代码编写如下:

ctx := TRttiContext.Create; try .... finally ctx.Free; end;

事实上,所有代码都是虚假的,可以简单地删除! TRttiContext变量将自动初始化自身.

这种设计也为那些喜欢使用FreeAndNil的Delphi程序员设置了一个巨大的Heffalump Trap.将记录传递给FreeAndNil会导致一些有趣的烟火!

本文共计563个文字,预计阅读时间需要3分钟。

Delphi XE3中E2382错误为何禁止实例变量直接调用构造函数?

我有一段简短的代码,在Delphi XE2中编译无误,但在XE3中编译时出现问题。我已将有问题代码减少到最小化,但仍想了解Delphi认为存在什么问题。尝试在Delphi XE2中编译包含此单元素的程序工。

我有一段简单的代码,在Delphi XE2中编译但在XE3中编译,我不知道为什么.我已经将有问题的代码减少到一点点,并且想知道Delphi认为它有什么问题.尝试在Delphi XE 2中编译包含此单元的项目工作正常,但在Delphi XE3(试用版)中,它给出了“[dcc32 Error] AffineTransform.pas(26):E2382无法使用实例变量调用构造函数”.我所知道的唯一“古怪”的东西是使用旧式的“对象”类型,其中构造函数与真实对象(基于TObject的类实例)实际上并不完全相同.

如果我用’procedure’替换这个对象中的’constructor’,那么它编译好了,但是为什么这样,这是我的代码中的一个好的改变,即它是一个不会对功能?

Delphi XE3中E2382错误为何禁止实例变量直接调用构造函数?

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样式对象,关键字构造函数实际上没有任何意义.虽然对象构造函数确实有一些特殊处理,但这里绝对没有必要.这里有什么只不过是一些方法的记录.

XE3编译器已更改,因此它不再允许您在实例方法内调用Self上的构造函数.类和对象都是这种情况.我没有看到任何关于为何进行此更改的文档.毫无疑问它会及时渗出.

您的直接解决方案是用过程替换构造函数.从长远来看,将其转化为记录而不是对象是有意义的.

我还会理解您将方法的名称更改为Initialize.一些图书馆设计师似乎选择在他们的记录上使用Create和Free方法.这导致了大量的代码编写如下:

ctx := TRttiContext.Create; try .... finally ctx.Free; end;

事实上,所有代码都是虚假的,可以简单地删除! TRttiContext变量将自动初始化自身.

这种设计也为那些喜欢使用FreeAndNil的Delphi程序员设置了一个巨大的Heffalump Trap.将记录传递给FreeAndNil会导致一些有趣的烟火!