我从移植代码中休息了一段时间,现在我又花了一些时间在它上面。
问题是,我想我仍然倒在脑后(D6上的一切正常:D)。
有谁能告诉我为什么这个简单的代码不起作用?
if NewSig <> NewCompressionSignature then
E2015运算符不适用于此操作数类型
以下是上述定义:
NewCompressionSignature: TCompressionSignature = 'DRM$IG01';
NewSig: array[0..SizeOf(NewCompressionSignature)-1] of Char;
答案 0 :(得分:0)
我只是在猜这里,因为没有给出TCompressionSignature
的类型,但如果ERROR2015
被声明为某种TCompressionSignature
,那么我可以重现ShortString
< / p>
type
TCompressionSignature = String[8]
您可能知道,Delphi目前使用Unicode作为其标准内部字符串编码。出于向后兼容性原因,类型ShortString
和其他短字符串类型(如String[8]
)保持不变。这些字符串具有与AnsiString
相同的编码,并由标准的普通旧1字节字符(AnsiChar
)组成。
NewSig
由双字节Unicode字符组成,无法直接与ShortString
进行比较。
您的问题的一个解决方案是声明:
NewSig: array[0..SizeOf(NewCompressionSignature)-1] of AnsiChar;
另一个解决方案是强制转换为字符串:
if NewSig <> String(NewCompressionSignature) then ...
但我希望尽可能改变数组声明。
请查看文档short strings和about unicode - 特别是如果您正在执行操作以确保使用正确的代码页读取和写入输入和输出。