我已经在我的枚举器类型上定义了一个 InRange
函数。如果传递的整数参数可以转换为枚举类型,函数应该返回True
。
TMyEnum = (eA, eB);
TMyEnumHelper = record helper for TMyEnum
class function InRange(AValue : integer) : Boolean; static;
end;
...
class function TMyEnumHelper.InRange(AValue : integer) : Boolean;
begin
Result :=
(AValue >= Low(TMyEnum)) and
(AValue <= High(TMyEnum));
end;
在编译时,在 (AValue >= Low(TMyEnum))
行,我收到以下错误:
[dcc32 Error] Unit1.pas(34): E2008 Incompatible types
我做了一些测试,但我真的不明白出了什么问题...... 即:
- 我尝试将
InRange
函数的AValue
参数类型切换为Byte
、ShortInt
、Word
、SmallInt
、LongWord
、Cardinal
、LongInt
、整数
> 和Int64
,但它在编译时会引发相同的错误。 - 如果我将枚举器定义为
TMyEnum = 0..1;
,编译时不会出现错误。
最佳答案
您不能直接将枚举值与整数进行比较。您必须将枚举值转换为整数值才能进行比较:
class function TMyEnumHelper.InRange(AValue : integer) : Boolean;
begin
Result :=
(AValue >= Ord(Low(TMyEnum))) and
(AValue <= Ord(High(TMyEnum)));
end;
请注意添加的“ord”转换,它将其“参数”(括号内的表达式)转换为整数值。
你的原因
TMyEnum = 0..1;
工作原理是这不是枚举,而是整数子范围,因此 TMyEnum 的基本类型是整数而不是枚举。
关于delphi - 如何检查整数是否可以转换为枚举类型值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59322222/