只是一个小问题,我没有找到具体的答案,所以我猜想在这里提问可能会更快。
编译器拒绝以下代码并出现以下错误:
不兼容的类型'动态阵列'和'字符串'
的数组
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;
我做错了什么?两者都是字符串数组,所以我不明白为什么一个人似乎是动态的。
答案 0 :(得分:9)
您无法轻松分配到MailText
和Anhang
,因为您无法声明具有兼容类型的其他对象。这是因为您在记录声明中使用了内联的动态数组类型。您确实需要使用可以命名的类型。为了更好地说明,请考虑以下事项:
X: array of Integer;
Y: array of Integer;
现在X
和Y
属于不同类型,X := Y
无法编译。
另一个问题是你的开放数组参数。开放数组参数与任何内容都不兼容。您可以逐个元素复制,但不能一次性分配数组。
最好的方法是声明这样的字段:
MailText,
Anhang: TArray<string>;
并将函数中的open数组参数更改为该类型。
然后您需要决定是要复制引用还是数组:
MailText := aMailText; // copy reference, or
MailText := Copy(aMailText); // copy array
答案 1 :(得分:5)
你有两个问题。首先,正如大卫所说,两个看起来相同的类型的声明,但是分别声明,使它们不同,赋值不兼容的类型。
奇怪的是,对于泛型类型,例如TArray<string>
,情况并非如此,所以如果您使用Delphi版本支持它,则使用它是有意义的。
但第二个问题是,您将{{1>}等开放数组参数与aMailText
等动态数组混淆。 mailInfo.MailText
,参数,根本不一定是动态数组,它可以是任何类型的数组。
查看文档:{{3}}
另一种解释:Open Arrays