【发布时间】:2011-12-11 03:19:11
【问题描述】:
我正在将一个 Delphi 项目移植到 64 位,但我遇到了包含 IN 运算符的代码行的问题。
编译器引发此错误
E2010 不兼容的类型:'Integer' 和 '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)]
【问题讨论】:
-
你可以考虑更快的
cardinal(I)<=cardinal(high(L)),它只用一个操作码进行比较,解决类型转换问题。 -
你应该非常小心确保
High(LArray) <= 255 -
@Arnaud 是什么让您认为性能如此重要?为什么您更喜欢使用具有隐藏细微差别和范围错误的神秘难读代码?这对我来说毫无意义。看起来像是过早优化的经典案例。
-
@salvador 如果您打算以这种方式使用集合,请确保您的代码包含
high(L)>=low(Byte)和high(L)<=high(Byte)的断言,这样就可以了。
标签: delphi 64-bit delphi-xe2