指向通用类型数组的指针?

sgt*_*gtz 4 c# arrays

我想创建一个泛型方法,该方法使用指向T数组的指针,其中T可以是C#原语,也可以是C#类.我一直很好,直到我尝试了"T"部分.

有没有办法解决错误"无法声明指向非非托管类型TIn的指针"

我尝试通过"fixed"关键字使用固定来实现这一点.

    public static object DoSomething<TIn, TOut>(object SObj, Action<TIn, TOut> takeAction)
    {
        double[]A = (double[]) SObj;
        TIn[]B = new TIn[5];
        unsafe
        {
            fixed (double* dbl = A) // <--- works okay
            {

            }
            fixed (TIn* Sptr = B)  // <--- fails
            {

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

-

@dtb:刚检查出blittable."blittable类型的一维数组,例如整数数组.但是,包含blittable类型的可变数组的类型本身并不是blittable." 即使存在可以约束的约束,似乎它们也将它限制为一维的数组.

Ada*_*ght 6

基本上没有.您无法创建指向托管类型的指针 - 仅限于某些基本类型和结构,其中所有字段本身都是结构或非托管类型.您的泛型参数类型将不具有这些属性,因此它禁止构造指针并为您提供该错误.

根据http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx,可以指向:

  • sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool.

  • 任何枚举类型.

  • 任何指针类型.

  • 任何用户定义的结构类型,仅包含非托管类型的字段.

幸运的是,由于指针算法是不可能的,因此指向托管类型的指针并没有多大好处.你为什么要建一个?

  • 当然有好处.与.NET或C#中的所有其他可用方法相比,使用指针进行转换数据的性能是因子2到3.事实上,我不知道为什么不应该对指针进行算术运算.你为什么没有arimetic值类型或blittable数据类型.对我来说,似乎大多数开发人员的表现并不是一个大问题,因为他们没有处理大量数据. (6认同)
  • 另一个好处.假设我有一个数组TY [],它实际上是一个双数组.我想指向TY并对其执行操作. (2认同)