在Delphi 64位项目中使用in运算符

前端之家收集整理的这篇文章主要介绍了在Delphi 64位项目中使用in运算符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在将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)));

最后,您可以修复代码,将High函数的结果转换为整数.

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 []);

猜你在找的Delphi相关文章