我正在尝试获取程序集中的所有类型 ( assembly.GetTypes()
),并且我尝试从中获取一个跨度,而无需任何堆分配,如下所示 assembly.GetTypes().AsSpan()
。然而奇怪的是,这会引发以下错误:
System.ArrayTypeMismatchException: 'Attempted to access an element as a type incompatible with the array.'
这让我有点困惑,更令人困惑的是, assembly.GetTypes().ToArray().AsSpan()
运行没有任何问题,但这显然不是一个解决方案。
一个 fiddle ,可以在 here 找到它.
最佳答案
assembly.GetTypes()
返回 RuntimeType[]
,但它使用数组类型协方差将其伪装成 Type[]
。根据 Span
constructor 的文档,一个ArrayTypeMismatchException
如果 T
则抛出(在本例中为 Type
)与运行时数组类型(在本例中为 RuntimeType
)不匹配。
assembly.GetTypes().ToArray()
另一方面返回实际的 Type[]
:它将根据声明的类型 T
创建一个全新数组,即Type
,这样你就得到了真实的Type[]
数组并且没有不匹配 -- T
是 Type
你正在传递一个真正的 Type[]
到Span
构造函数。
ReadOnlySpan<T>
没有这个约束,因为不可能编写不兼容的 Type
为只读RuntimeType[]
,所以你可以这样做:
new ReadOnlySpan<Type>(assembly.GetTypes());
关于c# - 无法从程序集中的所有类型获取 Span<Type>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63942274/