Delphi 不直接支持将整数类型转换为枚举的任何范围检查或超出范围的异常提升。请参阅:如何将整数转换为枚举类型? 我试图通过对枚举子范围索引的数组进行自动范围检查来解决这个问题。在我的测试程序中,我故意使用了非连续枚举,它禁用 RTTI 并为没有命名枚举但可以通过 typecasting、Inc、Dec 等访问的有效子范围值提供测试。
该程序按预期处理子范围 (2) 的非枚举元素,但不会为枚举数组生成超出范围的异常 - 但会为等效的整数索引数组生成。这有什么好的理由吗?我可以通过使用整数索引数组来解决,但枚举索引会更健壮一些。
type MyEnum = (zero,one,three=3);
var EnumCheck: array[MyEnum] of integer = (0,1,2,3);
var iEnum: integer;
var MyEnumVar: MyEnum;
var IntArray: array[0..3] of integer = (0,1,2,3);
procedure Test;
begin
{$R+}
MyEnumVar:= MyEnum (1); // One
iEnum := EnumCheck[MyEnumVar]; // OK - iEnum = 1
MyEnumVar:= MyEnum (2); // Out-of-bound
iEnum := EnumCheck[MyEnumVar]; // OK - iEnum = 2
MyEnumVar:= MyEnum (3); // Three
iEnum := EnumCheck[MyEnumVar]; // OK - iEnum = 3
MyEnumVar:= MyEnum (4); // Out-of-bound
iEnum := EnumCheck[MyEnumVar]; // no Exception; iEnum is set to random value
iEnum := 4;
iEnum := IntArray[iEnum]; // Exception thrown here
iEnum := IntArray[4]; // Compiler "subrange" error
end;
使用 Delphi 10.4 更新 2
编辑:我找到了我的工作。将校验数组定义为:
var iCheck: array[Ord(Low(MyEnum))..Ord(High(MyEnum))] of integer = (0,1,2,3);
并按预期抛出超出范围的异常。