14

我在一些 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现在,我已经用包含子句的(更大的)语句替换了该行。然而,这显然并不理想。谁能解释我为什么会遇到这个问题?

4

1 回答 1

24

关于文档Sets说:

基本类型最多可以有 256 个可能的值,它们的序数必须在 0 到 255 之间。

因此,即使您可以拥有任何值的枚举,该if xx in [a,b,c]语句也会在此处失败,因为集合不能包含大于 255 的值。

请改用 case 语句:

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

end;
于 2012-08-29T16:30:45.100 回答