【问题标题】:Duplicate identifier of property and method parameter of a class类的属性和方法参数的重复标识符
【发布时间】:2017-05-24 13:23:57
【问题描述】:

我将我的项目从 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 文档并没有发现任何此类限制。我只是好奇。

【问题讨论】:

    标签: delphi lazarus freepascal


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这是 $mode objfpc 的一个特性
    • 现在在文档中找到它。对于mode Delphi,它表示“类方法中的参数可以与类属性具有相同的名称(尽管这是一种不好的编程习惯)。”在mode objfpc 中禁止这种行为。谢谢。
    • 糟糕的编程习惯?废话!他们没听说过变量作用域吗?在 Pascal 和许多其他语言中,局部变量或参数隐藏一个不在范围内的标识符是正常的。 Plain Pascal 没有对象,但一个参数仍然隐藏了一个同名的全局变量。这不是糟糕的编程习惯,它应该是这样的。
    • @MarcovandeVoort:我不会称其为功能。这是糟糕的设计。
    • 这是一个意见。我对功能的看法是它是故意完成的(可以看出它在 Delphi 中有效)。我个人也不太喜欢 objfpc 模式。在大多数假设的情况下,恕我直言,在没有足够的收益来保证差异的情况下,恕我直言,“与众不同”有点过分了。
    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2013-03-16
    • 2011-12-26
    • 2014-03-04
    • 2017-04-04
    • 2014-07-17
    相关资源
    最近更新 更多