delphi - 如何检查整数是否可以转换为枚举类型值?

标签 delphi enums delphi-xe7

我已经在我的枚举器类型上定义了一个 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

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

  1. 我尝试将 InRange 函数的 AValue 参数类型切换为 ByteShortIntWordSmallIntLongWordCardinalLongInt整数 > 和 Int64,但它在编译时会引发相同的错误。
  2. 如果我将枚举器定义为 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/

相关文章:

android - 无法在 Android 设备 Delphi xe7 上滚动 ListView

multithreading - TParallel.For 中的 ASride 是什么意思?

swift - 如何将 Codable 协议(protocol)用于具有其他枚举作为关联值的枚举(嵌套枚举)

MySQL ENUM 选项值影响最大行大小?

delphi - 使用 THTTPRIO 时如何停止出现身份验证对话框

xml - 如何使用 Omni XML 中的命名空间来使用 XML SelectNodes()

delphi - 如何在Delphi中的Units初始化部分捕获异常

delphi - 使用变量作为变体不起作用

delphi - 如何更新 Delphi Datasnap 服务器?

vb.net - 如何将枚举添加到列表中