我正在将Delphi项目移植到64位,我遇到了一行有IN运算符的代码问题.
编译器引发此错误
E2010 Incompatible types: ‘Integer’ and ‘Int64’
我写了这个示例应用程序来复制问题.
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; Var I : Integer; L : Array of string; begin try if I in [0,High(L)] then except on E: Exception do Writeln(E.ClassName,': ',E.Message); end; readln; end.
这段代码工作正常32位,但为什么不用Delphi XE2 64位编译?我该如何解决这个问题?
*更新*
似乎我的帖子引起了很多混淆(对不起),只是为了解释我移植的原始代码更复杂,我只是将这段代码作为样本来说明问题.原始代码使用in运算符来检查一个值(小于255)是否属于一组值(所有次要或等于255),如此
i in [0,1,3,50,60,70,80,127,High(LArray)]
解决方法
此代码无法编译,因为
High
函数返回的是一个8字节值,这不是一个序数值.并且In运算符只能在具有序数值的集合中使用.
仅供参考,High函数返回的结果大小因参数传递的参数而异.
检查此样本
Writeln(SizeOf(High(Byte))); Writeln(SizeOf(High(Char))); Writeln(SizeOf(High(Word))); Writeln(SizeOf(High(Integer))); Writeln(SizeOf(High(NativeInt))); Writeln(SizeOf(High(TBytes)));
if I in [0,Integer(High(L))] then
UPDATE
检查David提供的其他信息,并记住在使用in运算符检查变量值集合中的值的成员资格时要非常小心. in运算符仅检查每个元素的最低有效字节(以delphi 32位为单位).
检查此样本
i:=257; Writeln( 1 in [i]);
返回true,因为257的低字节为1.
在Delphi 64位中,大于255的值被删除.所以这段代码
i:=257; Writeln( 1 in [i]);
将返回false,因为相当于
Writeln( 1 in []);