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

时间:2012-08-29 15:39:22

标签: 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);

失败的行如下:

if someObj.someProperty in [seFoo, seFar, seFooBar] then
...

虽然我理解another question posted here中显示的错误背后的原因,但是在使用变量时编译时没有对整数数组进行边界检查,看起来很奇怪我遇到了同样的问题。常数数组,最确定是在界限范围内。

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

1 个答案:

答案 0 :(得分:22)

有关Sets的文档说:

  

基本类型的可能值不超过256个,其序数必须介于0到255之间。

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

改为使用案例陈述:

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

end;