使用`in`关键字会导致Delphi中的"E1012常量表达式违反子范围边界"

Pol*_*ial 13 delphi compiler-errors delphi-2009

我在一些Delphi代码中遇到了一些相当不寻常的行为.当使用in关键字检查项是否在常量数组中时,我得到以下编译错误:

E1012常量表达式违反了子范围边界

常量定义如下:

type TSomeEnum = (seFoo = 1000,
                  seBar = 2000,
                  seBoo = 3000,
                  seFar = 4000,
                  seFooBar = 5000,
                  seBooFar = 6000,
                  seLow = 1000,
                  seHigh = 6000,
                  seCount = 6);
Run Code Online (Sandbox Code Playgroud)

失败的行如下:

if someObj.someProperty in [seFoo, seFar, seFooBar] then
...
Run Code Online (Sandbox Code Playgroud)

虽然我理解在这里发布的另一个问题中显示错误背后的原因,但是在使用变量时编译时没有对整数数组进行边界检查,看起来很奇怪,我在使用常量数组时遇到了同样的问题.绝对是在界限范围内.

就目前而言,我已经用包含or子句的(更大)语句替换了该行.但是,这显然不太理想.任何人都可以解释为什么我会遇到这个问题?

LU *_* RD 23

文档Sets说:

基类型可以具有不超过256个可能的值,并且它们的顺序必须介于0到255之间.

因此,即使您可以使用任何值的枚举,该if xx in [a,b,c]语句也会失败,因为一个集合不能保存大于255的值.

改为使用案例陈述:

case xx of
  a,b,c : // Make something 

end;
Run Code Online (Sandbox Code Playgroud)