在Delphi中将枚举值转换为整数

12

在Delphi中,是否可以将枚举值转换为整数?

如果可以,那么如何转换?


1
我想您是指枚举值。无论如何,只需使用Ord(myEnumValue)即可。 - MartynA
4个回答

28

这在枚举类型文档中明确指出:

几个预定义的函数操作于序数值和类型标识符。最重要的函数如下所述。

| 函数名 |                       参数                       |                      返回值 | 备注                                           |
|--------|:-------------------------------------------------:|------------------------------:|-----------------------------------------------|
| Ord    |                   序数表达式                  |  表达式值的序数 | 不接受Int64参数。                    |
| Pred   |                   序数表达式                  | 表达式值的前驱 |                                                   |
| Succ   |                   序数表达式                  |   表达式值的后继 |                                                   |
| High   | 序数类型标识符或序数类型变量 | 类型中的最高值             | 还适用于短字符串类型和数组。 |
| Low    | 序数类型标识符或序数类型变量 | 类型中的最低值              | 还适用于短字符串类型和数组。 |

2
那么...哪种做法是最佳实践,Ord(SomeEnumVariable) 还是 Integer(SomeEnumVariable) - Delmo
2
@Delmo 使用 Ord,避免强制转换。 - David Heffernan
谢谢你的回复,@David。但是使用类型转换有什么缺点吗? - Delmo
3
@Delmo 通常情况下,应该避免类型转换,因为它会破坏类型安全。但在这种情况下,它足够安全。你为什么不喜欢使用 Ord - David Heffernan
我喜欢最佳实践的主张 ;) 我只是想知道是否有一种比其他方式更受推荐。再次感谢! - Delmo

18

我看到David在我写这个回答时已经给你发了一个不错的答案,但是我还是会发表我的看法:

program enums;
{$APPTYPE CONSOLE}
uses
  SysUtils, typinfo;
type
  TMyEnum = (One, Two, Three);
var
  MyEnum : TMyEnum;
begin
  MyEnum := Two;
  writeln(Ord(MyEnum));  // writes 1, because first element in enumeration is numbered zero

  MyEnum := TMyEnum(2);  // Use TMyEnum as if it were a function
  Writeln (GetEnumName(TypeInfo(TMyEnum), Ord(MyEnum)));  //  Use RTTI to return the enum value's name
  readln;
end.

2
你发布了这篇文章做得非常好,因为其他专家可能不知道枚举变量所代表的含义有多容易混淆。当然有文档可以参考,但很多人会选择跳过它。"一个例子胜过千言万语"。 - user30478
我早就点赞了这个帖子,但不知何故又需要再次查看。感谢您的回复。 - user30478
@MartynA,我喜欢你对RTTI用途的简明解释。请考虑撰写一篇Delphi博客。 - Michael Riley - AKA Gunny
@MichaelRiley-AKAGunny:非常感谢。实际上,受到你之前的评论和Dave Nottage的一条评论的启发,我正在认真考虑这件事。事实上,过去几天我一直在开展一个ToolsApi项目,可能很有趣,值得写博客介绍。就像他们所说的,敬请关注此处。 - MartynA

4
将枚举转换为整数是可行的。由于无法评论其他回答,因此我将其发布为答案。将枚举强制转换为整数可能不是一个好主意(如果是,请发表评论)。
type
  TMyEnum = (zero, one, two);
var
  i: integer;
begin
  i := integer(two); // convert enum item to integer
  showmessage(inttostr(i));  // prints 2
end;

这个可能与Ord()类似,但我不确定哪个是最佳实践。如果您将枚举强制转换为整数,则上述方法也适用。

type
  TMyEnum = (zero, one, two);
var
  MyEnum: TMyEnum;
  i: integer;
begin
  MyEnum := two; 
  i := integer(MyEnum);      // convert enum to integer
  showmessage(inttostr(i));  // prints 2
end;

ShowMessage(IntToStr(High(Ord(two))))ShowMessage(IntToStr(High(Integer(two))))进行比较。 - Sertac Akyuz
Ord()函数是从Turbo Pascal时代遗留下来的吗?人们在没有转换可用时使用它吗?了解何时以及何时不使用转换与Ord()将会很有趣...据我所知,某个时候Pascal语言没有转换能力,而是使用特殊函数代替,但我还不够老,无法确定或记得 :-) - Another Prog
@AnotherProg,关于Ord(MyEnum)Integer(MyEnum)之间的最佳实践,我向@David提出了明确的问题。请查看David答案下的评论。 - Delmo

0

您可以使用Ord()函数来实现。为了更清晰,最好编写一对IntToEnum()和EnumToInt()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接