Использование ключевого слова `in` вызывает "E1012 Постоянное выражение нарушает границы поддиапазонов" в Delphi
Я столкнулся с некоторым довольно необычным поведением в части кода Delphi. При использовании ключевого слова in
для проверки того, находится ли элемент в постоянном массиве, я получаю следующую ошибку компиляции:
E1012 Константное выражение нарушает границы поддиапазонов
Константы определяются следующим образом:
type TSomeEnum = (seFoo = 1000,
seBar = 2000,
seBoo = 3000,
seFar = 4000,
seFooBar = 5000,
seBooFar = 6000,
seLow = 1000,
seHigh = 6000,
seCount = 6);
Неисправность строки следующая:
if someObj.someProperty in [seFoo, seFar, seFooBar] then
...
Пока я понимаю причину ошибки, отображаемой в другом вопросе, размещенном здесь, где проверка границ целых массивов не выполнялась во время компиляции при использовании переменной, кажется странным, что я получаю ту же проблему с постоянным массивом, который, безусловно, находится в пределах границ.
В настоящее время я заменил строку выражением (гораздо большим), состоящим из предложений or
. Однако это явно не идеально. Может ли кто-нибудь пролить свет на то, почему я получаю эту проблему?
Ответы
Ответ 1
Документация о Sets
говорит:
Базовый тип может иметь не более 256 возможных значений, а их порядковые числа должны находиться между 0 и 255.
Таким образом, даже если вы можете иметь перечисления любого значения, инструкция if xx in [a,b,c]
не работает здесь, так как набор не может содержать значение больше 255.
Вместо этого используйте оператор case:
case xx of
a,b,c : // Make something
end;