Delphi发送TObjectList就像var参数一样

T_E*_*M_A 1 delphi parameters compiler-errors tobjectlist

我有课

TFolder = class
    NODE_INDEX: Integer;
    FIRST_INDEX : Integer;
    CODE_NAME: AnsiString;
    NAME: AnsiString;

    constructor Create(NewNODE_INDEX, NewFIRST_INDEX: Integer; NewCODE_NAME, NewNAME: AnsiString);
    destructor Destroy; override;

  end;
Run Code Online (Sandbox Code Playgroud)

我有类型

type
  TFolderList = class (TObjectList<TFolder>)
  end;
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用这种类型

TAccount = class
  ...
  FOLDERS: TFolderList;
public
  constructor Create(...);
  destructor Destroy; override;

  procedure LoadFoldersFromDisk(var _objectList: TFolderList);
end;
Run Code Online (Sandbox Code Playgroud)

当我尝试发送我的TObject列表像参数

procedure TForm1.FormCreate(Sender: TObject);
begin 
  olLOCALFolders := TObjectList<TFolder>.Create();
  Account.LoadFoldersFromDisk(olLOCALFolders);
end;
Run Code Online (Sandbox Code Playgroud)

我收到错误"实际和正式var参数的类型必须相同".我做错了什么?

Dav*_*nan 6

错误是因为您的子类是一个新类型,不同于TObjectList<TFolder>错误.

派生这样的子类可能是错误的:

type
  TFolderList = class (TObjectList<TFolder>)
  end;
Run Code Online (Sandbox Code Playgroud)

这样做会强制所有各方使用该类型,并拒绝您利用通用类型兼容性的机会.如果您有一个通用的方法,TObjectList<T>那么您的新类型将是不兼容的.

而是声明一个别名:

type
  TFolderList = TObjectList<TFolder>;
Run Code Online (Sandbox Code Playgroud)

关于别名的观点是,它是相同类型的不同名称,而不是您的代码声明的新类型.

或者只是TObjectList<TFolder>在没有声明的情况下随处使用TFolderList.

更广泛地说,您的TFolder类型似乎更适合作为值类型.我认为作为记录而不是课程可能更好.

此外,var参数显示不正确.如果函数要修改引用,您将使用var参数.但是它将填充调用者传入的列表.您应该从参数列表中删除var.