Delphi类属性与方法参数重复标识符,如何巧妙改写为长尾?

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

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

Delphi类属性与方法参数重复标识符,如何巧妙改写为长尾?

我将我的项目从Delphi迁移到Lazarus。在一个表单中,我有一个私有方法,参数为var Active: Boolean。在Delphi中这没有问题,但在Lazarus中频繁出现错误:重复标识符活动和提示标识符已在第64行单元中定义。

我将我的项目从Delphi转移到Lazarus.在一个表单中,我有一个私有方法,参数var Active:Boolean.在Delphi中没关系,但Lazarus给出错误错误:重复标识符“活动”和提示:标识符已在第641行的单元FORMS中定义,在第641行有:

property Active: Boolean read FActive;

更改参数名称(使用重构)并不困难,但为什么我不能对方法的属性和参数使用相同的名称?
为了确保它不是Delphi自动转换的错误,我在Lazarus中创建了新项目并添加了私有方法

procedure Test(var Active: Boolean);

结果是一样的.即使我使用const或什么都不使用var.
我查看了FPC文档,但未发现任何此类限制.我只是好奇.

您应该能够为属性和参数使用相同的名称.它们具有不同的范围,因此最接近范围的那个(参数,应该被视为与局部变量在同一范围内)应该隐藏范围(属性)中的“更远”.在Delphi中,即使在该方法中,您仍然可以访问该属性,但是您应该将其限定为Self.Active:

procedure TForm1.Test(var Active: Boolean); var ParamActive: Boolean; FormActive: Boolean; begin ParamActive := Active; // gets the var parameter FormActive := Self.Active; // gets the property ... end;

我不知道为什么FPC将它标记为错误.它不应该.

更新

FWIW,如果你改变了

Delphi类属性与方法参数重复标识符,如何巧妙改写为长尾?

{$mode objfpc}

{$mode delphi}

它按预期编译,你不会收到错误.我刚试过这个.

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

Delphi类属性与方法参数重复标识符,如何巧妙改写为长尾?

我将我的项目从Delphi迁移到Lazarus。在一个表单中,我有一个私有方法,参数为var Active: Boolean。在Delphi中这没有问题,但在Lazarus中频繁出现错误:重复标识符活动和提示标识符已在第64行单元中定义。

我将我的项目从Delphi转移到Lazarus.在一个表单中,我有一个私有方法,参数var Active:Boolean.在Delphi中没关系,但Lazarus给出错误错误:重复标识符“活动”和提示:标识符已在第641行的单元FORMS中定义,在第641行有:

property Active: Boolean read FActive;

更改参数名称(使用重构)并不困难,但为什么我不能对方法的属性和参数使用相同的名称?
为了确保它不是Delphi自动转换的错误,我在Lazarus中创建了新项目并添加了私有方法

procedure Test(var Active: Boolean);

结果是一样的.即使我使用const或什么都不使用var.
我查看了FPC文档,但未发现任何此类限制.我只是好奇.

您应该能够为属性和参数使用相同的名称.它们具有不同的范围,因此最接近范围的那个(参数,应该被视为与局部变量在同一范围内)应该隐藏范围(属性)中的“更远”.在Delphi中,即使在该方法中,您仍然可以访问该属性,但是您应该将其限定为Self.Active:

procedure TForm1.Test(var Active: Boolean); var ParamActive: Boolean; FormActive: Boolean; begin ParamActive := Active; // gets the var parameter FormActive := Self.Active; // gets the property ... end;

我不知道为什么FPC将它标记为错误.它不应该.

更新

FWIW,如果你改变了

Delphi类属性与方法参数重复标识符,如何巧妙改写为长尾?

{$mode objfpc}

{$mode delphi}

它按预期编译,你不会收到错误.我刚试过这个.