类的属性和方法参数的重复标识符

时间:2017-05-24 13:23:58

标签: delphi lazarus freepascal

我将我的项目从Delphi转移到Lazarus。在表单中,我有一个带参数var Active: Boolean的私有方法。在Delphi中没关系,但Lazarus给出错误Error: Duplicate identifier "Active"Hint: Identifier already defined in unit FORMS at line 641,在第641行有:

property Active: Boolean read FActive;

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

procedure Test(var Active: Boolean);

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

1 个答案:

答案 0 :(得分:7)

您应该能够为属性和参数使用相同的名称。它们具有不同的范围,因此最接近范围的那个(参数,应该被视为与局部变量在同一范围内)应该隐藏一个"更远的范围"在范围(财产)。在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,如果你改变

{$mode objfpc}

{$mode delphi}

它按预期编译,并且您不会收到错误。我刚试过这个。