我定义了一个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 错误] Unit1.pas(34): E2008 不兼容的类型
我做了一些测试,但我真的不明白出了什么问题......
IE:
- 我尝试过切换
AValue
参数类型为InRange
功能为Byte
, ShortInt
, Word
, SmallInt
, LongWord
, Cardinal
, LongInt
, Integer
and 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 的基本类型是整数而不是枚举。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)