http://www.ecma -international.org / публикации / стандарты / Ecma-335.htm
Страница 334
"1.1.5.2 Управляемые указатели (type &)
1.2 Управляемые указатели (&) могут указывать на локальную переменную, аргумент метода, поле объекта, поле типа значения, элемент массива, статический элементполе или адрес, в котором будет храниться элемент после конца массива (для индексов указателей в управляемые массивы). Управляемые указатели не могут быть нулевыми. (Они должны сообщаться сборщику мусора, даже если они это делаютне указывать на управляемую память) "
Page 149
7.1.2 закреплено
Кодировка подписи для закрепленного должна появляться только в сигнатурах, которые описывают локальнуюпеременные (§15.4.1.3). Пока выполняется метод с закрепленной локальной переменной, VES не должен перемещать объект, на который ссылается локальный. То есть, если реализация CLI использует сборщик мусора, который перемещает объекты, сборщик долженне перемещать объекты, на которые ссылается активная закрепленная локальная переменная.[Обоснование: если неуправляемые указатели используются для разыменования управляемых объектов, эти объекты должны быть закреплены.Это происходит, например, когда управляемый объект передается методу, предназначенному для работы с неуправляемыми данными.конечное обоснование]
Я согласен с Гансом относительно рационального выбора дизайна языка msil.
Эти две вещи различны:
int[] arry = new int[5];
fixed (int* ptr = arry)
{
...
}
против
int* ptr = stackalloc int[5];
Если вы посмотрите на IL, созданный для второго, вы увидите это (что, я думаю, то, что вы ожидаете):
.locals init ([0] int32* ptr)
В первой версии (вашей версии) вы указываете на экземпляр System.Array (управляемого типа).В моей версии (с использованием stackalloc) вы указываете на то, что, я думаю, вы ожидаете указать на ... блок памяти, достаточно большой для 5 дюймов.