You would expect to see x vary in the order of the values in the list.
However – if x and the values are of an enumerated type, looping the “list” does NOT loop in the apparent order of the constant, but in the order of the enumerated type declaration, such as it would for any set.
An example:
program EnumArrayvsEnumSet;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TEnum = (plough, foo, bar, wtf);
procedureOutput(const aEnum: TEnum);
begin
case aEnum of
wtf: Writeln('wtf');
plough: Writeln('plough');
bar: Writeln('bar');
foo: Writeln('foo');
else Writeln('Missed one!');
end;
end;
procedureTestEnumSet;
var
enum: TEnum;
begin
for enum in [wtf, plough, bar, foo]
do Output(enum);
end;
procedureTestEnumArray;
var
enum: TEnum;
enumArray: TArray<TEnum>;
begin
enumArray := [wtf, plough, bar, foo];
for enum in enumArray
do Output(enum);
end;
begin
try
try
Writeln('Declared: TEnum = (plough, foo, bar, wtf)');