添加第九个枚举时类型转换无效
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)。
我继承了一些需要修改的代码。原文基本上就是下面的内容。我需要向枚举列表中添加第九个项目,但是当我这样做时,我在 "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)。