考虑以下程序:
{$APPTYPE CONSOLE}
type
TMyEnum = (enum1, enum2, enum3);
var
Arr: TArray<TMyEnum>;
Enum: TMyEnum;
begin
Arr := [enum3, enum1]; // <-- this is an array
for Enum in Arr do
Writeln(ord(Enum));
Writeln('---');
for Enum in [enum3, enum1] do // <-- this looks very much like the array above
Writeln(ord(Enum));
Writeln('---');
Readln;
end.
输出为:
2 0 --- 0 2 ---
为什么两个回路产生不同的输出?
for Enum in Arr do
Writeln(ord(Enum));
在这里,Arr
是一个数组,因此该数组的项按顺序输出。该文件说:
数组以递增顺序遍历。
因此2
,输出为before 0
。
for Enum in [enum3, enum1] do
Writeln(ord(Enum));
在这里,[enum3, enum1]
是一个集合,并且集合的枚举数正好按顺序值的递增顺序枚举。因此输出0
优先。
我认为在文档中没有按顺序列出集合的说明,但从经验上看似乎是这种情况。但是,由于集合是无序类型,因此无论如何都不应依赖于其枚举顺序。
因此,问题就变成了[...]
在代码的不同点如何理解集合或数组。这一切都源于新的XE7动态数组语法,它引入了(另一种)句法歧义。当我们写
Arr := [enum3, enum1];
然后[enum3, enum1]
是一个数组。编译器知道这Arr
是一个数组,并且该信息定义了文字的类型。
但是当我们写
for Enum in [enum3, enum1] do
然后[enum3, enum1]
是一组。在这里,字面量原则上可以是数组或集合。在这种情况下,我相信编译器将始终喜欢使用集合。
再次,我找不到任何文档说明这种情况,但是从经验上讲,是这种情况。据推测,由于集合枚举器早于新的动态数组语法,因此在存在歧义时,它们优先。
形式文字的含义[...]
取决于其上下文。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句