属性 的重复标识符和 class 的方法参数
Duplicate identifier of property and method parameter of a class
我将我的项目从 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 文档,没有发现任何此类限制。我只是好奇。
您应该能够对 属性 和参数使用相同的名称。它们有不同的作用域,所以作用域中最近的那个(参数,应该被视为与局部变量在同一作用域中)应该隐藏作用域中的"further away"(属性)。在 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}
它确实按预期编译,您不会收到错误。我刚刚试过了。
我将我的项目从 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 文档,没有发现任何此类限制。我只是好奇。
您应该能够对 属性 和参数使用相同的名称。它们有不同的作用域,所以作用域中最近的那个(参数,应该被视为与局部变量在同一作用域中)应该隐藏作用域中的"further away"(属性)。在 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}
它确实按预期编译,您不会收到错误。我刚刚试过了。