-->

为什么我会收到“类型没有所属类别”与枚举类型错误(Why do I get “type has no

2019-07-17 22:38发布

我已经宣布,其中我想要的第一构件为具有1(一)的序号值以下枚举类型而不是通常的0(零):

  type
    TMyEnum = (
               meFirstValue = 1,
               meSecondValue,
               meThirdValue
              );

如果我调用所属类别(),例如以GetEnumName()的调用的一部分,我得到一个编译错误:

  GetEnumName(TypeInfo(TMyEnum), Ord(aValue));

错误:“E2134:类型‘TMyEnum’没有所属类别”

为什么是这样?

我知道,类只有所属类别,如果他们启用了$ M编译器选项编译或,但我不认为有具有所属类别的枚举类型的任何特殊情况(一些类是,如TPersistent派生)。

Answer 1:

不连续的枚举和枚举不从零开始没有所属类别。 对于所属类别中实现,这将需要从现有tkEnumeration不同的格式,由于向后兼容性问题。

我考虑推行tkDiscontiguousEnumeration(或可能更好的命名部件)德尔福2010年,但它的好处似乎是小考虑到其相对稀缺性和在列举的困难 - 你如何有效编码范围? 一些编码方式为某些情况下对别人好,加重病情。



Answer 2:

不支持特定地方序值具有对那些通常由编译器被分配不同的序号值分配该结果在枚举成员枚举类型的信息。

如果特定值是必不可少的或合乎需要的,“未使用”枚举成员将要被插入到“垫”视需要的枚举。 例如,(为了强调额外缩进只):

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue
              );

然后,子范围可被用于“过滤器”出未使用的初始值:

   TValidMyEnum = meFirstValue..meThirdValue;

虽然你可能那么不妨考虑重命名原来的枚举类型,以便您的子界类型可以在整个项目中使用。

如果枚举包含“差距”中的子区域是不够的:

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue,
                meNOTUSED2,
               meFinalValue   {= 5}
              );

在这种情况下,没有简单的方法来延长编译时间范围检查,以排除未使用的成员,但几集类型将简化实施必要的运行时检查的业务:

  type
    TMyEnums = set of TMyEnum;

  const
    meNOTUSED      = [meUNUSED1, meUNUSED2]; //  .. etc as required
    meValidValues  = [Low(TMyEnum)..High(TMyEnum)] - meNOTUSED;


  if NOT (aValue in meValidValues) then
     // etc


文章来源: Why do I get “type has no typeinfo” error with an enum type