E2001 需要序号类型

E2001 Ordinal type required

这里需要Ordinal类型的一些错误,请帮我从下面的代码中检查出来:

摘自评论:

Program Test;    
{$APPTYPE CONSOLE}    
Type
  TResourceSet = set of 0..127;
var
  N : TResourceSet;
  i : Int64;
begin
  i := 127;
  N := N + [i];  // E2001 Ordinal type required
end.

64 位类型不能用于集合操作。因此编译器错误 E2001 Ordinal type required.

我找不到任何关于为什么编译器不允许这样做的文档。 Ordinal Types 中的一些细节指出 Int64 不符合与某些序数函数一起使用的条件。

无论如何,为了使其工作,您可以将类型声明为 Integer 或将您的 64 位整数复制到一个字节。

Program Test;    
{$APPTYPE CONSOLE}    
Type
  TResourceSet = set of 0..127;
var
  N : TResourceSet;
  i : Int64;
  j : Byte;
  k := Integer;
begin
  i := 127;
  j := i;
  k := i;
  N := N + [j];  // Ok
  N := N + [k];  // ok
end.

或者,按照@Andreas 的建议,使用类型转换:

N := N + [Byte(i)];