在C#中固定IEnumerables

gog*_*ole 0 c#

我想用我正在研究的这种通用扩展方法将IEnumerable实现固定在内存中.它似乎适用于数组,但与其他序列(列表和集合)失败.这是方法实现.

    // <summary>
    ///  Pins an IEnumerable of type T in memory
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="sequence"></param>
    /// <returns></returns>
    public static GCHandle Pin<T>(this IEnumerable<T> @sequence)
    {
        return GCHandle.Alloc(@sequence, GCHandleType.Pinned);
    }
Run Code Online (Sandbox Code Playgroud)

为什么某些类型失败但为其他类型工作?你能解释一下这背后的概念吗?有没有比我的通用方法更好的方法呢?谢谢.

Bar*_*lly 7

文件GCHandle.Alloc指示:

无法固定具有非原始(非blittable)成员的实例.

对象引用不是原始(也称为blittable)成员.类似类型的实现在List<T>内部使用对象引用(例如数组引用).因此,他们有非原始成员,不能固定.

数组是不同的:如果数组的元素类型是blittable(即没有非blittable字段的值类型),则可以固定数组.但这并不意味着可以固定对阵列的引用; 对数组的引用不是数组.集合类List<T>包含对内部存储阵列的引用.它们本身不是数组.