Мое предположение - и это только предположение - заключается в том, что это связано с различием между векторами и массивами.
Спецификация ECMA CLI (Раздел II, Разделы 14.1 и14.2) говорит следующее:
Векторы - это одномерные массивы с нулевой нижней границей.Они имеют прямую поддержку в инструкциях CIL (newarr
, ldelem
, stelem
и ldelema
).
[...]
В то время как векторы имеют прямую поддержку через CILинструкции, все другие массивы поддерживаются VES путем создания подтипов абстрактного класса System.Array
.
Векторы объявляются с использованием синтаксиса T[]
, тогда как массивы могут объявляться различными способами с использованием T[n]
, T[p,q]
, T[x...y]
и т. Д. Итак, в вашем первом примере синтаксис int32[0 ... 10]
является объявлением array .Во втором примере синтаксис int32[]
представляет собой объявление vector .
Я предполагаю, что верификатор возражает против вашего первого примера, поскольку он думает, что вы пытаетесь использовать newarr
и stelem
в массиве вместо вектора .Предположительно, верификатор только проверяет тип объявления и не учитывает ранг, границы и т. Д. Массива.Причина, по которой оба примера выполняются должным образом, заключается в том, что одномерный массив с нулевой нижней границей является вектором для всех намерений и целей.
Что касается того, почему в сообщении об ошибке указано «Ожидаетсяодномерный массив », а не« ожидаемый вектор », понятия не имею!