首页 > 解决方案 > 如何检查整数是否可以转换为枚举类型值?

问题描述

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 不兼容的类型

我做了一些测试,但我真的不明白出了什么问题......即:

  1. 我尝试将函数的AValue参数类型切换为, , , , , , , and ,但在编译时会引发相同的错误。InRangeByteShortIntWordSmallIntLongWordCardinalLongIntIntegerInt64
  2. 如果我将枚举数定义为TMyEnum = 0..1;,它编译时不会出错。

标签: delphienumsdelphi-xe7

解决方案


您不能直接将枚举值与整数进行比较。您必须将枚举值转换为整数值才能进行比较:

class function TMyEnumHelper.InRange(AValue : integer) : Boolean;
begin
  Result :=
    (AValue >= Ord(Low(TMyEnum))) and
    (AValue <= Ord(High(TMyEnum)));
end;

请注意添加的“ord”转换,它将其“参数”(括号内的表达式)转换为整数值。

你的原因

TMyEnum = 0..1;

有效的是,这不是枚举,而是整数子范围,因此 TMyEnum 的基本类型是整数而不是枚举。


推荐阅读