c# - 无法从程序集中的所有类型获取 Span<Type>

标签 c# .net-core

我正在尝试获取程序集中的所有类型 ( 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[]数组并且没有不匹配 -- TType你正在传递一个真正的 Type[]Span构造函数。

ReadOnlySpan<T>没有这个约束,因为不可能编写不兼容的 Type为只读RuntimeType[] ,所以你可以这样做:

new ReadOnlySpan<Type>(assembly.GetTypes());

关于c# - 无法从程序集中的所有类型获取 Span<Type>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63942274/

相关文章:

c# - ClosedXML 解析数字中的逗号

c# - 以编程方式检查 httpErrors errorMode

c# - UDPClient 多播在具有多个 NIC 的计算机上接收失败

c# - 使用 Swagger 在 ASP.NET Core 中实现 OAuth

C# 释放 IntPtr 引用的内存

c# - Asp.net c# 中的偏移 div 元素

azure - 通过Proxy .net core连接Azure存储

c# - 如何在没有 DI 的类库中使用 ILogger<Class>

character-encoding - 更改响应头编码 .Net Core

c# - EntityFramework (.NET Core) 多个条件左外连接