delphi - 如何检查整数是否可以转换为枚举类型值?
问题描述
我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 不兼容的类型
我做了一些测试,但我真的不明白出了什么问题......即:
- 我尝试将函数的
AValue
参数类型切换为, , , , , , , and ,但在编译时会引发相同的错误。InRange
Byte
ShortInt
Word
SmallInt
LongWord
Cardinal
LongInt
Integer
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 的基本类型是整数而不是枚举。
推荐阅读
- html - 以 HTML 格式加载 CSV
- c# - IText7 和 C# 中缺少 GetPageN 方法
- jenkins - Opencenus 阻止我的 java 进程退出
- android - 在哪里存储读/写 json 文件?
- javascript - 添加 CSS 关键帧动画会改变图像大小
- php - PHP 服务器只运行 300 秒
- react-native - TopTabNavigator 添加自定义图标
- sql-server - 使用查询将数据从 Excel 导入 SQL Server
- java - Java nio 仅读取 8192/433000 字节
- floating-point - VHDL中单精度浮点数的三角函数