То, что говорит RRUZ, совершенно правильно.
Чтобы добавить немного более подробного объяснения, в 64-битном Delphi индексы динамического массива могут иметь ширину 64 бита.Это явно необходимо, например, при работе с большим блоком памяти TBytes.И поэтому функция high
должна возвращать значение достаточно широкого типа, чтобы содержать все возможные индексы.Таким образом, high
при применении к динамическому массиву возвращает значение типа Int64
.
. Как только вы начинаете компилировать 64-битный код, оператор in
не подходит для проблемы, которую вы пытаетесь решить.Хотя вы могли бы использовать приведение, которое предлагает RRUZ, может быть более понятным написать код, подобный этому
if (I=low(L)) or (I=high(L)) then
Хотя оператор in
создает довольно читаемый код, я считаю, что приведение к Integer
здесь не приемлемо.Это просто установит ловушку для вас, когда вы впервые получите массив с более чем high(Integer)
элементами.Когда это произойдет, код с приведением перестанет работать.
Но на самом деле проблемы гораздо глубже, чем это.Версия кода in
дает сбой задолго до того, как вы достигнете элементов high(Integer)
.Оказывается, ваш код во время компиляции на самом деле не работает.Например, рассмотрим эту программу:
program WeirdSets;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
a: array of Integer;
begin
SetLength(a, 257);
Writeln(BoolToStr(Length(a) in [0, Length(a)], True));
end.
Можно ожидать, что эта программа выведет True
, но на самом деле она выдает False
.Если вместо этого вы должны были написать
Writeln(BoolToStr(Length(a) in [0, 257], True));
, то компилятор сообщает:
[DCC Error] WeirdSets.dpr(9): E1012 Constant expression violates subrange bounds
Основная проблема здесь заключается в том, что наборы ограничены 256 элементами, поэтому, как только у вас будет массив сЕсли его длина больше этого, ваш код перестает работать.
К сожалению, поддержка Delphi для наборов просто неадекватна и требует срочного внимания.
Мне также интересно, действительно ли вы хотелинапишите
if I in [0..High(L)] then
Если это так, я бы порекомендовал вам использовать функцию InRange
из Math
.
if InRange(I, 0, High(L)) then
или даже лучше
if InRange(I, low(L), High(L)) then