Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从程序集中的所有类型获取Span_C#_.net Core - Fatal编程技术网

C# 无法从程序集中的所有类型获取Span

C# 无法从程序集中的所有类型获取Span,c#,.net-core,C#,.net Core,我正在尝试获取assembly.GetTypes中的所有类型,并尝试从中获得一个跨度,而不需要任何堆分配,就像这个assembly.GetTypes.AsSpan一样。但奇怪的是,这会引发以下错误: System.ArrayTypeMismatchException:“试图以与数组不兼容的类型访问元素。” 这让我有点困惑,更让我困惑的是assembly.GetTypes.ToArray.AsSpan运行时没有任何问题,但这显然不是一个解决方案 一个小提琴,它表明这是正确的。assembly.Ge

我正在尝试获取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;
而且RuntimeType不是公共的,所以将其转换为不必复制数组是不可能的,只是试图找到一个不涉及复制数组的解决方案。我的意思是,这显然是有道理的,即使这确实有点让人头疼,因为无论我做什么,我不能直接从这个数组创建一个跨度,哈?感觉应该在AsSpan方法中记录这个跨度。@20我已经用一个可能对你有用的替代方法更新了我的答案。如果您不打算向span写入任何内容,那么您可以使用一个不会抛出的ReadOnlySpan。@Jeff噢,这实际上比预期的要容易得多,幸运的是我没有修改数组,所以非常感谢!