C# 在C中固定IEnumerables#

C# 在C中固定IEnumerables#,c#,C#,我想用我正在研究的这个通用扩展方法将IEnumerable实现固定在内存中。它似乎可以很好地处理数组,但无法处理其他序列(列表和集合)。下面是方法实现 // <summary> /// Pins an IEnumerable of type T in memory /// </summary> /// <typeparam name="T"></typeparam> /// <param name="

我想用我正在研究的这个通用扩展方法将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);
    }
//
///在内存中固定类型为T的IEnumerable
/// 
/// 
/// 
/// 
公共静态GCHandle引脚(此IEnumerable@sequence)
{
返回GCHandle.Alloc(@sequence,GCHandleType.pinted);
}
为什么它对某些类型无效,但对其他类型有效?你能解释一下这背后的概念吗?有没有比我的通用方法更好的方法?谢谢。

for
GCHandle.Alloc
表示:

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

对象引用不是基元(也称为blittable)成员。
List
等类型的实现在内部使用对象引用(如数组引用)。因此,它们具有非原始成员,不能固定

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

如果您真的需要它,我建议您调用
.ToArray()
并锁定它


但要小心,因为IEnumerable本身使用延迟求值/延迟执行,因此可枚举的值当前可能根本不在内存中。事实上,你甚至可以拥有一个永不停止的IEnumerable。

嗨,joel,难以置信,我没想到。我已经将该方法的范围限制在T的数组中,其中T是struct:public static GCHandle Pin(这个T[]@序列),其中T:struct。谢谢你提供的信息。