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

下午所有,

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

在分配内存并正确索引数组时,我需要一个与数组相同类型的指针数组,即长数组需要long*[] myLargeArray 。 问题是当我使用generics时,这个声明变成T*[] myLargeArray ,它总是产生错误‘不能获取地址,获取大小,或者声明指向托管类型的指针(’T’)’

提前致谢。

PS在有人问之前,是的,我确实需要这么大的arrays。

2D数组的代码示例:

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

根据C#编程指南 :

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

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

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

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

来自MSDN

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

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