添加第九个枚举时类型转换无效

invalid typecast when Ninth enumeration added

我继承了一些需要修改的代码。原文基本上就是下面的内容。我需要向枚举列表中添加第九个项目,但是当我这样做时,我在 "ord(byte(ts))";

处得到了一个无效的类型转换
program OrdTest;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  TFlag = (tsOne, tsTwo, tsThree, tsFour, tsFive, tsSix, tsSeven, tsEight); // , tsNine
  TStatus = set of TFlag;

function GetStatus(i: integer): TStatus;
var
  ts: TStatus;
  j: smallint;
begin
  try
    ts := GetStatus(4);  // returned from a table

    j := ord(byte(ts)); // Invalid typecast
  except
    on E: Exception do
      Writeln(E.Message)
  end;

end;

end.

由于一个字节可以是任何有效到 255 的字节,我不明白这个例外。

如何添加第九个枚举,代码功能仍然存在?

在添加 tsNine 之前,您有 8 个枚举值,因此其中一组占用 8 位并适合 Byte。现在你有 9 位并且需要一个 Word 来适应集合。因此你现在必须转换为 Word。您可以查看 SizeOf(ts) 亲自查看。

你好像把两种东西混在一起了。

枚举

这些是作为整数值实现的。默认情况下,它们是连续的。但您也可以为它们设置特定的值。例如:

type
  TEnum = (eOne, eTwo, eThree);
  TBigEnum = (beOne = 1, beTen = 10, beHundred = 100, beThousand = 1000);

在这里,一个 TEnum 确实适合一个字节,最大值为 255。一个 TBigEnum 需要一个 Word(因为值为 beThousand)。

这些是作为位数组实现的。 "Enumeration 1" 是第一位,"enumeration 2" 是第二位,依此类推。如果您有 8 个或更少的枚举,它将适合 1 个字节、9 到 16、2 个字节等。

根据我之前的例子, TEnum = 一组枚举 TBigEnums = 一组 TBigEnum

不会编译,因为值 "TBigEnum.eThousand" 将是集合中的第 1001 个(基于零的)位,需要 126 字节的集合。 Delphi 将集合的大小限制为 32 个字节(最大值 = 255)。