Я реализую класс неуправляемого массива в C #, который мне нужен для некоторых вызовов OpenGL.
Все идет отлично, но я наткнулся на препятствие.Следующий код не компилируется, и я понимаю, почему, но как я могу заставить его работать?
public T this[int i]
{
get { return *((T*)arrayPtr + i); }
set { *((T*)arrayPtr + i) = value; }
}
Я думал, что это может сработать, если я гарантирую, что T является структурой
unsafe class FixedArray<T> where T : struct
Также не работает ...
Как получить что-то функционально эквивалентное тому, что я пытаюсь сделать выше?
РЕДАКТИРОВАТЬ: я использую неуправляемый массив сMarshal.AllocHGlobal (), чтобы мой массив был зафиксирован и GC не перемещал его.OpenGL на самом деле не обрабатывает инструкции, когда вы вызываете его, OpenGL будет пытаться получить доступ к массиву спустя долгое время после возврата функции.
Вот весь класс, если это поможет:
unsafe class FixedArray<T> where T : struct
{
IntPtr arrayPtr;
public T this[int i]
{
get { return *((T*)arrayPtr + i); }
set { *((T*)arrayPtr + i) = value; }
}
public FixedArray(int length)
{
arrayPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)) * length);
}
~FixedArray()
{
Marshal.FreeHGlobal(arrayPtr);
}
}
Сообщение об ошибке: Невозможно получить адрес, получить размер или объявить указатель на управляемый тип ('T')