С#: использование общего для создания массива указателей

Вторая половина дня,

немного помогите, пожалуйста. Чтобы обойти ограничение объекта 2Gb в .NET, я создал класс, который выделяет память в куче, и это позволяет мне создавать массивы до предела моей свободной ОЗУ. Однако для простоты разработки (поскольку это было доказательством концепции) он был жестко закодирован для долгого времени. Теперь, когда он работает, я пытаюсь изменить код для использования дженериков, поэтому я могу использовать один и тот же код для нескольких типов.

При распределении памяти и правильном индексировании массива мне нужен массив указателей того же типа, что и массив, т.е. для длинного массива требуется long*[] myLargeArray. Проблема в том, что когда я использую generics, это объявление становится T*[] myLargeArray, которое всегда вызывает ошибку . Невозможно принять адрес, получить размер или объявить указатель на управляемый тип ('T') '

Спасибо заранее.

PS Прежде чем кто-нибудь спросит, да, мне действительно нужны такие большие массивы.

Пример кода для 2D-массива:


    LargeArray <int> myArray = new LargeArray<int>(x, y);

    public unsafe class LargeArray where T : struct
    {
        ...
        private T*[] tArr;
        ...
        public LargeArray(long sizeI, long sizeJ)
        {
            ...
            myLargeArray = new T*[sizeI];
            ...
        }
    }

Ответ 1

В соответствии с Руководство по программированию на С#:

Любой из следующих типов может быть Тип указателя:

  • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal или bool
  • Любой тип перечисления.
  • Любой тип указателя.
  • Любой пользовательский тип структуры, содержащий поля неуправляемых типов только.

Когда вы помещаете ограничение struct на ваш общий тип, компилятор не имеет достаточной информации, чтобы сделать вывод, что все вышеуказанные требования будут выполнены (в частности, последняя точка).

Поскольку у нас нет шаблонов на С#, вам может потребоваться создать перегрузки вашего адаптера array/pointer для числовых типов, которые имеют смысл, или класс factory, который создает LargeArray с учетом размера определенный тип.

Ответ 2

Из MSDN

Даже при использовании с небезопасными ключевое слово, взяв адрес управляемый объект, получая размер управляемый объект или объявление указателя к управляемому типу не допускается. Для Дополнительная информация, см. Небезопасный код и Указатели (Руководство по программированию на С#).

Также я не знаю, есть ли у вас, но убедитесь, что вы используете фиксированное ключевое слово в своем коде.