为什么两个看似相同的动态数组类型被认为不兼容?

Flo*_*och 6 delphi delphi-xe5

只是一个小问题,我没有找到具体的答案所以我猜这可能会更快在这里问.

编译器拒绝以下代码,并出现以下错误:

不兼容类型'动态数组'和'数组字符串'

TMailInfo = record
  FileName,
  MailAdresse,
  MailBCC,
  MailCC,
  MailBetreff: string;
  MailText,
  Anhang: array of string;
  MailAcknowledge,
  MailTXT: Boolean
end;

class function TEMail.SendOutlookCOMMail(aFileName, aMailAdresse, 
  aMailBCC, aMailCC, aMailBetreff: string; 
  aMailText, aAnhang: array of string; 
  const aMailAcknowledge, aMailTXT: Boolean): Boolean;
var
  mailInfo: TMailInfo;
begin
...
  mailInfo.MailBetreff := aMailBetreff;  // these two lines cause the error
  mailInfo.MailText := aMailText;
...
end;
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?两者都是字符串数组,所以我不明白为什么一个似乎是动态的.

Dav*_*nan 9

您无法轻松分配MailText,Anhang因为您无法声明具有兼容类型的其他对象.那是因为你在记录声明中使用了内联的动态数组类型.您确实需要使用可以命名的类型.为了更好地说明,请考虑以下事项:

X: array of Integer;
Y: array of Integer;
Run Code Online (Sandbox Code Playgroud)

现在XY不同的类型,X := Y不编译.

另一个问题是你的开放数组参数.开放数组参数与任何内容都不兼容.您可以逐个元素复制,但不能一次性分配数组.

最好的方法是声明这样的字段:

MailText,
Anhang: TArray<string>;
Run Code Online (Sandbox Code Playgroud)

并将函数中的open数组参数更改为该类型.

然后,您需要决定是要复制引用还是数组:

MailText := aMailText; // copy reference, or
MailText := Copy(aMailText); // copy array
Run Code Online (Sandbox Code Playgroud)


Rud*_*uis 5

你有两个问题.首先,正如大卫所说,两个看起来相同的类型的声明,但是分别声明,使它们不同,赋值不兼容的类型.

奇怪的是,对于泛型类型来说并非如此TArray<string>,所以如果您使用Delphi版本支持它,那么使用它是有意义的.

但第二个问题是,你混淆了一个开放数组参数就像aMailText一个动态数组一样mailInfo.MailText.aMailText,参数,根本不一定是动态数组,它可以是任何类型的数组.

看一下文档:Open Arrays

另一种解释:打开数组参数和const数组