在Delphi XE6中使用枚举错误声明数组

Dan*_*llo 4 arrays delphi enums

当我声明这样的枚举时:

TConfigBaudRate = (br9600 = 6, br19200 = 8);
Run Code Online (Sandbox Code Playgroud)

并尝试将此枚举与数组一起使用,如下所示:

const
    CBaudRates: array [TConfigBaudRate] of string = ('9600', '19200');
Run Code Online (Sandbox Code Playgroud)

Delphi返回以下错误:

E2072元素数量(2)与声明(3)不同

但是,如果我声明TConfigBaudRate没有值或它的第一个项的值.

似乎Delphi创建了一个7号元素.这是Delphi的正常特性吗?我找不到任何参考.

Ken*_*ite 11

这是记录在案的行为.

简单类型 - 具有明确分配的普通性的枚举类型 :( 强调我的)

默认情况下,枚举值的序数从0开始,并遵循其标识符在类型声明中列出的顺序.您可以通过为声明中的部分或全部值明确指定顺序来覆盖它.要为值指定一个常量,请使用= constantExpression跟随其标识符,其中constantExpression是一个求值为整数的常量表达式.例如:

type Size = (Small = 5, Medium = 10, Large = Small + Medium);
Run Code Online (Sandbox Code Playgroud)

定义一个名为Size的类型,其可能的值包括Small,Medium和Large,其中Ord(Small)返回5,Ord(Medium)返回10,Ord(Large)返回15.

枚举类型实际上是一个子范围,其最低值和最高值对应于声明中常量的最低和最高序数.在前面的示例中,Size类型有11个可能的值,其序数范围从5到15.(因此Char的类型数组[Size]表示一个包含11个字符的数组.)这些值中只有三个具有名称,但其他值是可以通过类型转换和例如Pred,Succ,Inc和Dec等例程访问.在下面的示例中,Size的范围内的"anonymous"值被赋给变量X.

var 
  X: Size; 
  X := Small;   // Ord(X) = 5 
  X := Size(6); // Ord(X) = 6 
  Inc(X);       // Ord(X) = 7
Run Code Online (Sandbox Code Playgroud)

所以,对于你的例子,即使你只使用了两个值(6和8),7也是一个包含的值,即使它没有被命名,因为它属于指定的顺序,就像所描述的array[Size] of Char那样.表示一个包含11个字符的数组.


Dav*_*nan 6

问题是您的枚举类型指定了序数值,并且您使用明确指定的常规错过了一些值.

文档的关键引用是:

枚举类型实际上是一个子范围,其最低值和最高值对应于声明中常量的最低和最高序数.

该方案显示,ord(low(TConfigBaudRate))6ord(high(TConfigBaudRate))8.

{$APPTYPE CONSOLE}

type
  TConfigBaudRate = (br9600 = 6, br19200 = 8);

begin
  Writeln(ord(low(TConfigBaudRate)));
  Writeln(ord(high(TConfigBaudRate)));
end.
Run Code Online (Sandbox Code Playgroud)

产量

6
8

这意味着您的数组包含三个序号为6,7和8的项.您只在常量中指定了两个值,这就是编译器错误告诉您的内容.

您可以通过提供三个值来解决编译器错误,如下所示:

const
  CBaudRates: array [TConfigBaudRate] of string = ('9600', '', '19200');
Run Code Online (Sandbox Code Playgroud)

但是,我认为整个体验是语言告诉你停止使用明确指定的标准的方式.