我可以将集类型用作数组索引吗?

时间:2017-09-07 14:01:37

标签: arrays delphi set type-safety

我不能使用set类型作为数组的大小指示器,但是对于小集合这样做是完全合理的。

假设我有以下代码:

  TFutureCoreSet = set of 0..15;
  TLookupTable = record
    FData: array[TFutureCoreSet] of TSomeRecord; //error ordinal type required
  ....

以下代码编译并运行。

  TFutureCoreSet = set of 0..15;
  TLookupTable = record
    FData: array[word] of TSomeRecord;

然而,这打破了TFutureCoreSet中允许的状态数与查找表中的元素之间的链接 是否有一种简单的方法可以将两者联系起来,以便在更改其他更新时也是如此?

1 个答案:

答案 0 :(得分:12)

只是略有不同:

type
  TFutureCore = 0..15;
  TFutureCoreSet = set of TFutureCore;
  TFutureCoreIndex = 0..(2 shl High(TFutureCore)) - 1;
  TLookupTable = record
    FData: array[TFutureCoreIndex] of TSomeRecord;
  end;

使用TFutureCoreIndex的另一个好处是,您可以使用它将TFutureCoreSet类型转换为序数类型。在对类型进行类型转换时,必须强制转换为相同大小的序数类型。

AllowedStates = LookupTable.FData[TFutureCoreIndex(FutureCores)]; //works
AllowedStates = LookupTable.FData[Integer(FutureCores)]; //invalid typecast
AllowedStates = LookupTable.FData[Word(FutureCores)]; //works, but not type safe.