C# 无法从程序集中的所有类型获取Span
我正在尝试获取assembly.GetTypes中的所有类型,并尝试从中获得一个跨度,而不需要任何堆分配,就像这个assembly.GetTypes.AsSpan一样。但奇怪的是,这会引发以下错误: System.ArrayTypeMismatchException:“试图以与数组不兼容的类型访问元素。” 这让我有点困惑,更让我困惑的是assembly.GetTypes.ToArray.AsSpan运行时没有任何问题,但这显然不是一个解决方案 一个小提琴,它表明这是正确的。assembly.GetTypes返回RuntimeType[],但它使用数组类型协方差将其伪装为类型[]。根据的文档,如果在本例中为Type的T与在本例中为RuntimeType的运行时数组类型不匹配,则会引发ArrayTypeMismatchException 另一方面,assembly.GetTypes.ToArray返回实际类型[]:它将基于声明的类型T(即类型)创建一个全新的数组,因此您将获得一个真正的类型[]数组,并且不存在不匹配-T是类型,并且您正在将一个真正的类型[]传递给跨度构造函数 ReadOnlySpan没有此约束,因为无法将不兼容的类型写入只读RuntimeType[],因此可以执行以下操作: 新的ReadOnlySpanassembly.GetTypes;C# 无法从程序集中的所有类型获取Span,c#,.net-core,C#,.net Core,我正在尝试获取assembly.GetTypes中的所有类型,并尝试从中获得一个跨度,而不需要任何堆分配,就像这个assembly.GetTypes.AsSpan一样。但奇怪的是,这会引发以下错误: System.ArrayTypeMismatchException:“试图以与数组不兼容的类型访问元素。” 这让我有点困惑,更让我困惑的是assembly.GetTypes.ToArray.AsSpan运行时没有任何问题,但这显然不是一个解决方案 一个小提琴,它表明这是正确的。assembly.Ge
而且RuntimeType不是公共的,所以将其转换为不必复制数组是不可能的,只是试图找到一个不涉及复制数组的解决方案。我的意思是,这显然是有道理的,即使这确实有点让人头疼,因为无论我做什么,我不能直接从这个数组创建一个跨度,哈?感觉应该在AsSpan方法中记录这个跨度。@20我已经用一个可能对你有用的替代方法更新了我的答案。如果您不打算向span写入任何内容,那么您可以使用一个不会抛出的ReadOnlySpan。@Jeff噢,这实际上比预期的要容易得多,幸运的是我没有修改数组,所以非常感谢!