Delphi 为什么我得到E2356属性访问器必须是实例字段或方法
编制本单元时:Delphi 为什么我得到E2356属性访问器必须是实例字段或方法,delphi,delphi-2007,Delphi,Delphi 2007,编制本单元时: 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; p
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 Error]Test.pas(15):E2356属性访问器必须是实例字段或方法
但如果我把第12行注释掉,它就可以编译了。有人能解释一下原因吗?我需要将日期作为类变量来存储日期间隔。该错误应该是自解释的。让我们试着去构造它 属性访问器必须是实例字段或方法 属性访问器是
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;
我赞成前者,因为它在类字段和实例字段之间提供了更清晰的区分。类变量扩展到
fTest
字段,使其成为类字段。为了避免将简单的var
放在fTest
之前,第二个测试表单是我编译的实际单元。原因似乎是类变量。如果知道它为什么会这样,那就太好了。好的,现在更新让一切都清楚了。我已经相应地更新了我的答案。谢谢,你知道了!它实际上隐藏了一个潜在的bug,因为我以前有一堆由类的所有实例共享的类变量。不管怎么说,它似乎能工作,但现在我做对了。是的,这里的语法很弱。将其与C#进行比较。有很多模棱两可的地方。这就是为什么我总是使用重复的私有声明来分隔类字段和实例字段。使用与函数中变量相同的格式和缩进样式来处理带有var
和class var
的类字段将有助于暴露此错误。也就是说,将[class]var
单独放在一行上,并缩进它下面的所有内容。然后更清楚的是,FTest
与StartDate
和EndDate
具有相同的分类;我们已经接受过培训,知道缩进中的差异不会从类var
标题中释放FTest
。