我在一些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
子句的(更大)语句替换了该行。但是,这显然不太理想。任何人都可以解释为什么我会遇到这个问题吗?
答案 0 :(得分:22)
有关Sets
的文档说:
基本类型的可能值不超过256个,其序数必须介于0到255之间。
因此,即使您可以使用任何值的枚举,if xx in [a,b,c]
语句也会失败,因为一个集合不能保存大于255的值。
改为使用案例陈述:
case xx of
a,b,c : // Make something
end;