for Enum in Arr do
Writeln(ord(Enum));
Здесь Arr
— это массив, поэтому элементы массива выводятся по порядку. В документации говорится:
Массив просматривается в возрастающем порядке.
Следовательно, 2
выводится перед 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]
является набором. Здесь литерал, в принципе, может быть либо массивом, либо набором. Я считаю, что в таких ситуациях компилятор всегда будет отдавать предпочтение наборам.
Опять же, я не могу найти никакой документации, в которой утверждается, что это так, но эмпирически это так. Предположительно, поскольку перечислители наборов предшествуют новому синтаксису динамических массивов, они имеют приоритет при наличии неоднозначности.
Значение литерала формы [...]
зависит от его контекста.
person
David Heffernan
schedule
29.06.2015