为什么我收到有关Delphi不兼容类型(数组和动态数组)的错误?

时间:2014-03-03 06:48:19

标签: arrays delphi dynamic-data

编辑:这是从Are objects reference counted in Windows-targeted Delphi applications, and if so, what is its purpose?Dynamic arrays and memory management in Delphi开始的。

我有两个课程(TGenericHoldingSummaryTGenericHoldingResultSet)和一个记录(TGenericHoldingResult)。

  • TGenericHoldingSummary包含一个TGenericHoldingResultSet,如果需要,该nil设置为TGenericHoldingResultSet并从数据库延迟加载。
  • TGenericHoldingResult包含TGenericHoldingResultSet条记录的动态数组。

在下面,错误发生在TGenericHoldingResult = record code : Integer; level : String; msg : String; end; TGenericHoldingResultSet = class(TObject) public // Lifecycle constructor Create(parent : TGenericHoldingSummary; resArr : Array of TGenericHoldingResult); destructor Destroy; // Accessors function ResultCount() : Integer; function Result(i : Integer) : TGenericHoldingResult; private // Variables summary : TGenericHoldingSummary; resultArray : Array of TGenericHoldingResult; end; TGenericHoldingSummary = class(TObject) public // Note that the summary object 'owns' the results, and deallocates // its memory in the destructor. function getResultSet: TGenericHoldingResultSet; private // Member variables resultSet: TGenericHoldingResultSet; end; // Note that the summary object 'owns' the results, and deallocates // its memory in the destructor. function TGenericHoldingSummary.getResultSet() : TGenericHoldingResultSet; var sql : String; i : Integer; resultArray : Array of TGenericHoldingResult; begin if resultSet = nil then begin // Get results via SQL. SetLength(resultArray, holding.clientDataSet.RecordCount); for i := 0 to holding.clientDataSet.RecordCount - 1 do begin resultArray[i].code := holding.clientDataSet.FieldByName('code').AsInteger; resultArray[i].level := holding.clientDataSet.FieldByName('level').AsString; resultArray[i].msg := holding.clientDataSet.FieldByName('message').AsString; end; resultSet := TGenericHoldingResultSet.Create(self, resultArray); end; result := resultSet; end; // Lifecycle constructor TGenericHoldingResultSet.Create(parent : TGenericHoldingSummary; resArr : Array of TGenericHoldingResult); begin summary := parent; // The following *should* work, shouldn't it? // E.g., seeing as dynamic arrays a reference counted in Delphi for // all platforms, this should simply increment the reference count. resultArray := resArr; end; 构造函数中的赋值。

[DCC Error] GenericHolding.pas(302): E2010 Incompatible types: 'Dynamic array' and 'Array'

错误如下:

{{1}}

1 个答案:

答案 0 :(得分:5)

您无法将打开的数组分配给动态数组。请参阅Open Array Parameters

  

注意:开放数组参数的语法类似于动态数组类型的语法,但它们并不意味着相同。前面的示例创建了一个函数,该函数接受任何Char元素数组,包括(但不限于)动态数组。要声明必须是动态数组的参数,您需要指定类型标识符:

type TDynamicCharArray = array of Char;
function Find(const A: TDynamicCharArray): Integer;

可以在此处找到open arrays用例的完整摘要以及与动态数组的区别:Open array parameters


如果你有一个支持泛型的Delphi版本,可以声明构造函数头:

constructor TGenericHoldingResultSet.Create(parent : TGenericHoldingSummary; 
  const resArr : TArray<TGenericHoldingResult>);

以及resultArrayTArray<TGenericHoldingResult>

这将避免必须为数组声明特定类型。

如David所述,开放数组具有一个优势,因为它们具有更广泛的用例,应尽可能使用。