Delphi发送了TObjectList-like-var参数

Delphi发送了TObjectList-like-var参数,delphi,parameters,compiler-errors,tobjectlist,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; overr

我有课

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;
而且我有打字

type
  TFolderList = class (TObjectList<TFolder>)
  end;
当我尝试发送TObject list-like参数时

procedure TForm1.FormCreate(Sender: TObject);
begin 
  olLOCALFolders := TObjectList<TFolder>.Create();
  Account.LoadFoldersFromDisk(olLOCALFolders);
end;
我得到的实际和形式var参数的错误类型必须相同。我做错了什么?

只需将TObjectList替换为您之前定义的TFolderList即可:

procedure TForm1.FormCreate(Sender: TObject);
begin 
  olLOCALFolders := TFolderList.Create();
  Account.LoadFoldersFromDisk(olLOCALFolders);
end;
但是,您可能不需要在此处使用var参数-方法名称LoadFoldersFromDisk表明该方法将使用项填充作为参数发送的列表,并且为此,您可以按值发送列表。只有当该方法会提醒列表对象的内存位置而不是其内容时,即LoadFoldersFromDisk可以释放原始列表并创建新列表时,才需要使用var参数。

只需将TObjectList替换为之前定义的TFolderList即可:

procedure TForm1.FormCreate(Sender: TObject);
begin 
  olLOCALFolders := TFolderList.Create();
  Account.LoadFoldersFromDisk(olLOCALFolders);
end;

但是,您可能不需要在此处使用var参数-方法名称LoadFoldersFromDisk表明该方法将使用项填充作为参数发送的列表,并且为此,您可以按值发送列表。只有当该方法会提醒列表对象的内存位置而不是其内容时,即LoadFoldersFromDisk可以释放原始列表并创建新列表时,才需要使用var参数。

错误是因为您的子类是新类型,不同于TObjectList,因此出现错误

导出这样的子类可能是错误的:

type
  TFolderList = class (TObjectList<TFolder>)
  end;
这样做会迫使各方使用该类型,并剥夺您利用泛型类型兼容性的机会。如果您有一个在TObjectList上操作的泛型方法,那么您的新类型将不兼容

而是声明一个别名:

type
  TFolderList = TObjectList<TFolder>;
别名的要点是,它是同一类型的不同名称,而不是代码声明的新类型

或者只是到处使用TObjectList而不声明TFolderList

更广泛地说,您的TFolder类型似乎更适合作为值类型。我认为作为一张唱片可能比作为一门课更好


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

错误是因为您的子类是一个新类型,不同于TObjectList,因此出现了错误

导出这样的子类可能是错误的:

type
  TFolderList = class (TObjectList<TFolder>)
  end;
这样做会迫使各方使用该类型,并剥夺您利用泛型类型兼容性的机会。如果您有一个在TObjectList上操作的泛型方法,那么您的新类型将不兼容

而是声明一个别名:

type
  TFolderList = TObjectList<TFolder>;
别名的要点是,它是同一类型的不同名称,而不是代码声明的新类型

或者只是到处使用TObjectList而不声明TFolderList

更广泛地说,您的TFolder类型似乎更适合作为值类型。我认为作为一张唱片可能比作为一门课更好

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