Использование ключевого слова `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;