【问题标题】:pointer to a array of type generic? [duplicate]指向泛型数组的指针? [复制]
【发布时间】:2011-09-05 11:15:14
【问题描述】:

我想创建一个泛型方法,它使用指向 T 数组的指针,其中 T 可以是 C# 原语或 C# 类。在我尝试“T”部分之前,我一直进展顺利。

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

我尝试通过“固定”关键字使用固定来实现这一点。

    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
            {

            }
        }
    }

--

@dtb:刚刚签出了 blittable。 “blittable 类型的一维数组,例如整数数组。但是,包含 blittable 类型的可变数组的类型本身不是 blittable。”即使有 biltable 约束,他们似乎也将其限制为一维数组。

【问题讨论】:

  • 泛型和unsafe 不能很好地混合。你需要一个不存在的where TIn : blittable 约束(Blittable and Non-Blittable Types)。你想达到什么目的?
  • 不支持指向泛型类型的指针。编译器也会告诉你的。你对此无能为力。只需生成具体类型。
  • n 维数组的转换器逻辑,用于一组大约十几种类型。指针本来是理想的。
  • @dtb:感谢您指出“blittable”。刚刚用这些信息更新了上面的问题。
  • 您可以通过使用void* 指针来实现这一点,您只需要记住之后将其转换回具体类型指针...

标签: c# arrays


【解决方案1】:

基本上,不。您不能创建指向托管类型的指针 - 只能创建某些原始类型和结构,其中所有字段本身都是结构或非托管类型。您的泛型参数类型将没有这些属性,因此它禁止构造指针并给您该错误。

根据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 倍。事实上,我不知道为什么不能对指针进行算术运算。你为什么没有 arimetric 值类型或 blittable 数据类型。对我来说,这里的大多数开发人员的性能似乎并不是什么大问题,因为他们没有处理大量数据。
  • 另一个好处。假设我有一个数组 TY[] 实际上是一个双数组。我想获取一个指向 TY 的指针并对其执行操作。
  • 确实不能声明 T* 类型的指针,但您仍然可以通过使用 GCHandle 类固定数组来获取指向通用 T[] 数组的 IntPtr 类型的指针然后检索指针。
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2021-07-29
  • 2012-05-12
  • 2021-02-07
  • 2012-11-17
  • 2016-07-30
相关资源
最近更新 更多