3

我正在将一个集合类型和一个数字编码到一个(32 位)标签属性中。从标签中检索集合很简单:TDaySet(Byte((tag and $ff000000) shr 24)). 但是如何设置包含此编码集信息的常量?

const
  FRED_SCHEDULE = ID_FRED or (Byte([Monday, Wednesday]) shl 24);

这不编译。实际的错误是“无效的类型转换”,但我认为根本问题是我试图从一个类型化的常量初始化一个非类型化的常量。

有没有人有更好的主意?

4

1 回答 1

3

好吧,首先[Monday, Wednesday]不是类型化的常量。它不是类型化常量,因为您没有声明类型。一个类型化的常量是

const
  Days: TSetOfDays = [Monday, Wednesday];

但是,如您所知,您无法从类型化常量中创建真正的常量。而且您不能指望编译器知道如何解释[Monday, Wednesday]您的表达式,因为您没有声明类型。

因此,您不能使用集合表示法来声明一个真正的常量,因为如果您指定了集合的类型,您只能使用集合表示法。这意味着您尝试做的事情可能实际上是不可能的。我的意思是,你可以这样写:

const
  FRED_SCHEDULE = ID_FRED 
    or ((1 shl ord(Monday) or 1 shl ord(Wednesday)) shl 24);

但这样做太疯狂了。

于 2013-06-24T14:25:18.927 回答