为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我得到一个“枚举类型”的“类型没有类型信息”错误

为什么我得到一个“枚举类型”的“类型没有类型信息”错误

繁星淼淼 2019-11-20 09:42:25
我声明了以下枚举类型,我希望第一个成员的序数值为1(一个),而不是通常的0(零):  type    TMyEnum = (               meFirstValue = 1,               meSecondValue,               meThirdValue              );如果我调用TypeInfo(),例如,作为对GetEnumName()的调用的一部分,则会出现编译器错误:  GetEnumName(TypeInfo(TMyEnum), Ord(aValue));错误:“ E2134:类型'TMyEnum'没有typeinfo”为什么是这样?我知道,只有在启用$ M编译器选项或(从某些类(例如TPersistent)派生)进行编译的情况下,类才具有typeinfo ,但我认为为枚举类型使用typeinfo并不存在任何特殊条件。
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

不连续的枚举,以及不是从零开始的枚举,都没有typeinfo。要实现typeinfo tkEnumeration,由于向后兼容性问题,它的格式必须与现有格式不同。


我考虑过tkDiscontiguousEnumeration为Delphi 2010 实现一个(或可能命名更好的成员),但是考虑到它们的相对稀缺性以及枚举的困难,收益似乎很小-您如何有效地编码范围?有些编码在某些情况下更好,而在另一些情况下则更糟。


查看完整回答
反对 回复 2019-11-20
?
烙印99

TA贡献1829条经验 获得超13个赞

当您想将枚举转换为特定值(并返回)时,我通常使用每个枚举值所需的值创建一个数组const:


Const MyEnumValues: array[TMyEnum] of integer = (1,2,5);

这样,当枚举扩展时,您会得到一个编译器错误,指出您缺少数组值。


请注意,更改枚举顺序时,必须相应更改值。


要获取枚举值的“值”,只需编写:


Value := MyEnumValues[myenum];

为了获得基于“值”的枚举值,只需循环MyEnumValues的值即可:


Function GetEnumByValue(value:integer): TMyEnum;

Var

  myenum: TMyEnum;

Begin

  For myenum = low(TMyEnum) to high(TMyEnum) do

    If MyEnumValues[myenum] = value then

      exit(myenum);

  Raise exception.create(‘invalid value for tmyenum’);

End;


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 656 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信