C#:使用泛型来创建指针数组

Bre*_*dan 12 c# generics pointers

下午所有,

如果你愿意,请帮助一下.为了规避.NET中的2Gb对象限制,我创建了一个在堆上分配内存的类,这允许我创建最大可达RAM空间的数组.但是,为了便于开发(因为它是一个概念证明),它很难编写.现在它工作了我一直在尝试改变代码使用泛型,所以我可以使用相同的代码多种类型.

在分配内存并正确索引数组时,我需要一个与数组相同类型的指针数组,即需要长数组long*[] myLargeArray.问题是当我使用泛型这个声明变成时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];
            ...
        }
    }

Run Code Online (Sandbox Code Playgroud)

Ste*_*idi 12

根据C#编程指南:

以下任何类型都可以是指针类型:

  • sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool
  • 任何枚举类型.
  • 任何指针类型.
  • 任何用户定义的结构类型,仅包含非托管类型的字段.

当您将struct约束放在泛型类型上时,编译器没有足够的信息来推断将满足所有上述要求(特别是最后一点).

由于我们在C#中没有模板,因此您可能需要考虑为有意义的数字类型创建数组/指针适配器的重载,或者创建一个创建LargeArray给定大小的特定类型的工厂类.


Sta*_* R. 0

来自MSDN

即使与 unsafe 关键字一起使用,也不允许获取托管对象的地址、获取托管对象的大小或声明指向托管类型的指针。有关详细信息,请参阅不安全代码和指针(C# 编程指南)。

我也不知道你是否是,但请确保你在代码中使用固定关键字。