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

时间:2009-10-27 15:48:34

标签: 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];
            ...
        }
    }

2 个答案:

答案 0 :(得分:12)

根据C# programming guide

  

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

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

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

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

答案 1 :(得分:0)

来自MSDN

  

即使与不安全一起使用   关键字,取一个地址   托管对象,获得一个大小   托管对象,或声明指针   不允许使用托管类型。对于   更多信息,请参阅Unsafe Code and Pointers (C# Programming Guide).

此外,我不知道您是否,但请确保您在代码中使用fixed keyword