猿问

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

我声明了以下枚举类型,我希望第一个成员的序数值为1(一个),而不是通常的0(零):


  type

    TMyEnum = (

               meFirstValue = 1,

               meSecondValue,

               meThirdValue

              );

如果我调用TypeInfo(),例如,作为对GetEnumName()的调用的一部分,则会出现编译器错误:


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

错误:“ E2134:类型'TMyEnum'没有typeinfo”


为什么是这样?


我知道,只有在启用$ M编译器选项或(从某些类(例如TPersistent)派生)进行编译的情况下,类才具有typeinfo ,但我认为为枚举类型使用typeinfo并不存在任何特殊条件。


繁星淼淼
浏览 668回答 3
3回答

交互式爱情

不连续的枚举,以及不是从零开始的枚举,都没有typeinfo。要实现typeinfo tkEnumeration,由于向后兼容性问题,它的格式必须与现有格式不同。我考虑过tkDiscontiguousEnumeration为Delphi 2010 实现一个(或可能命名更好的成员),但是考虑到它们的相对稀缺性以及枚举的困难,收益似乎很小-您如何有效地编码范围?有些编码在某些情况下更好,而在另一些情况下则更糟。

烙印99

当您想将枚举转换为特定值(并返回)时,我通常使用每个枚举值所需的值创建一个数组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;
随时随地看视频慕课网APP
我要回答