【问题标题】:Delphi Sent TObjectList like var parameterDelphi 发送 TObjectList like var 参数
【发布时间】:2016-12-02 16:46:15
【问题描述】:

我有课

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;

那我试试用这个类型

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

  procedure LoadFoldersFromDisk(var _objectList: TFolderList);
end;

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

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

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

【问题讨论】:

    标签: delphi parameters compiler-errors tobjectlist


    【解决方案1】:

    错误是因为您的子类是一种新类型,不同于TObjectList&lt;TFolder&gt;,因此是错误。

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

    type
      TFolderList = class (TObjectList<TFolder>)
      end;
    

    这样做会迫使各方使用该类型,并剥夺您利用泛型类型兼容性的机会。如果您有一个在TObjectList&lt;T&gt; 上运行的通用方法,那么您的新类型将不兼容。

    改为声明一个别名:

    type
      TFolderList = TObjectList<TFolder>;
    

    关于别名的要点在于,它是同一类型的不同名称,而不是您的代码声明的新类型。

    或者直接在任何地方使用TObjectList&lt;TFolder&gt;而不声明TFolderList

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

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

    【讨论】:

      【解决方案2】:

      只需将TObjectList&lt;TFolder&gt; 替换为您之前定义的TFolderList

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多