【问题标题】:Why do I get E2356 Property accessor must be an instance field or method为什么我得到 E2356 属性访问器必须是实例字段或方法
【发布时间】:2012-11-06 17:16:41
【问题描述】:

编译本单元时:

unit Test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    class var StartDate, EndDate: TDateTime;   // Line 12
    fTest: TNotifyEvent;
  public
    property OnTest: TNotifyEvent read fTest;  // Line 15.
  end;

implementation

{$R *.dfm}

end.

我收到以下编译器错误:

[DCC 错误] Test.pas(15): E2356 属性访问器必须是实例字段或方法

但是如果我注释掉第 12 行,它编译得很好。有人可以解释为什么吗?我需要将日期作为类变量来存储日期间隔。

【问题讨论】:

    标签: delphi delphi-2007


    【解决方案1】:

    该错误应该是不言自明的。让我们尝试解构它。

    属性访问器必须是实例字段或方法。

    属性访问器read之后的表达式。如果您的属性是可写的,那么write 后面的表达式也将是一个属性访问器。

    因此,在您的代码中,属性访问器是fTest

    实例字段是类的普通字段。因此,类字段不符合条件。类似地,实例方法是类的普通方法。类方法不是实例方法。事实上,任何不是类方法的方法都是实例方法。

    因此,该错误表明fTest 不是实例字段。

    这是正确的。它是一个类字段。

    private
      class var StartDate, EndDate: TDateTime;   
      fTest: TNotifyEvent; // class var applies to fTest also
    

    我猜你的意思不是让fTest 成为一个类字段。你需要这样写类:

    TForm1 = class(TForm)
    private
      class var StartDate, EndDate: TDateTime;   
    private
      fTest: TNotifyEvent;
    public
      property OnTest: TNotifyEvent read fTest;  
    end;
    

    或许:

    TForm1 = class(TForm)
    private
      class var
        StartDate, EndDate: TDateTime;   
      var 
        fTest: TNotifyEvent;
    public
      property OnTest: TNotifyEvent read fTest;  
    end;
    

    我更喜欢前者,因为它可以更清晰地区分类和实例字段。

    【讨论】:

    • 第二个 Testform 是我编译的实际单元。原因似乎是类变量。很高兴知道它为什么会这样。
    • 好的,现在更新让一切都清楚了。我已经相应地更新了我的答案。
    • 谢谢,明白了!它实际上隐藏了一个潜在的错误,因为我之前有一堆由类的所有实例共享的类变量。无论如何它似乎工作,但现在我做对了。
    • 是的,这里的语法很弱。将其与 C# 进行比较。模棱两可的范围很大。这就是为什么我总是使用重复的私有声明来分隔类和实例字段。
    • 对具有varclass var 的类字段使用与函数中的变量相同的格式和缩进样式将有助于暴露此错误。也就是说,将[class] var 单独放在一行上,并将其下的所有内容缩进。然后更清楚FTestStartDateEndDate具有相同的分类;我们已经受过训练,知道仅仅缩进的不同不会从class var 标题中释放FTest
    【解决方案2】:

    class var 扩展到 fTest 字段,使其成为类字段。为避免在fTest 之前放置一个简单的var

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 1970-01-01
      • 2016-08-04
      • 2019-03-08
      • 2013-03-23
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多