【问题标题】:Why are two seemingly identical dynamic array types deemed not assignment compatible?为什么两个看似相同的动态数组类型被认为不兼容?
【发布时间】:2014-07-18 06:36:19
【问题描述】:

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

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

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

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;

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

【问题讨论】:

  • 一些一般性建议。尽可能使用 const 参数。它更好地表达意图,并让编译器进行优化。
  • 是的,没错,我也会重构它——我正在处理的不是我的代码,我只是在扩展功能
  • 链接,因为它似乎与stackoverflow.com/q/22140387/460775重复

标签: delphi delphi-xe5


【解决方案1】:

您不能轻易地分配给MailTextAnhang,因为您不能声明另一个具有兼容类型的对象。那是因为您在记录声明中使用了内联动态数组类型。您确实需要使用可以命名的类型。为了更好地说明,请考虑一下:

X: array of Integer;
Y: array of Integer;

现在XY 是不同的类型,X := Y 不能编译。

另一个问题是您的开放数组参数。开放数组参数是不兼容的赋值。您可以逐个复制元素,但不能一次性分配数组。

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

MailText,
Anhang: TArray<string>;

并将函数中的开放数组参数更改为该类型。

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

MailText := aMailText; // copy reference, or
MailText := Copy(aMailText); // copy array

【讨论】:

  • 谢谢,这行得通——我会尽快接受
【解决方案2】:

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

奇怪的是,对于泛型类型(如TArray&lt;string&gt;)而言并非如此,因此如果您的 Delphi 版本支持它,那么使用它是有意义的。

但第二个问题是您将像aMailText 这样的开放数组参数 与像mailInfo.MailText 这样的动态数组 混淆了。 aMailText这个参数,根本就不一定是动态数组,可以是任何一种数组。

查看文档:Open Arrays

另一种解释:Open array parameters and array of const

【讨论】:

  • 感谢您的建议,我真的没想太多细节,但现在有道理了
  • @Rudy 你写的答案表明我没有涉及开放数组参数问题
  • 在阅读时,AFAICS 还没有。我错过了吗?如果是这样,我很抱歉。
  • 它一直都在。没关系。我只是想为自己辩护! :-)
  • 好吧,我一定错过了,抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2011-07-23
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
相关资源
最近更新 更多