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

标签 c# generics pointers

大家下午好

如果你愿意,可以提供一点帮助。为了规避 .NET 中的 2Gb 对象限制,我制作了一个在堆上分配内存的类,这允许我创建不超过可用 RAM 限制的数组。然而,为了便于开发(因为它是一个概念证明),它被硬编码了很长时间。现在它可以工作了,我一直在尝试更改代码以使用泛型,这样我就可以对多种类型使用相同的代码。

在分配内存和正确索引数组时,我需要一个与数组将保存的类型相同的指针数组,即长数组需要 long*[] myLargeArray。问题是当我使用泛型时,这个声明变成了 T*[] myLargeArray,它总是产生错误 'Cannot take the address of, get the size of, or declare a pointer到托管类型 ('T')'

提前致谢。

PS 在任何人问之前,是的,我确实需要这么大的阵列。

二维数组的代码示例:


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

最佳答案

根据C# programming guide :

Any of the following types may be a pointer type:

  • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool
  • Any enum type.
  • Any pointer type.
  • Any user-defined struct type that contains fields of unmanaged types only.

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

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

关于C#:使用泛型创建指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1631754/

相关文章:

代理服务器的 C# 性能(与 C++ 相比)

java - 参数化类型参数?

c - 为什么要传递一个指向全局结构的指针?

c - 在 C 中使用结构指针进行数组赋值

java - Java 中 <T> 和 <T extends Object> 有什么区别?

c++ - "int* ptr = int()"值初始化如何不非法?

c# - ElasticSearch电子邮件地址,带有特殊字符,例如@

c# - 如何使用 AutoMapper 将从 ForMember() 中的函数调用获得的值传递给另一个值

c# - 安全软件许可证检查/验证

generics - Kotlin 中的通用约束,这仅仅是一个方差问题吗?