C# 如何从Span/ReadOnlySpan创建不可变数组?

C# 如何从Span/ReadOnlySpan创建不可变数组?,c#,C#,假设我有如下方法: 不安全的无效转换(字节*ptr,整数长度) { var span=新的span(ptr,长度); var arr=ImmutableArray.CreateRange(span);//错误:无法从“System.span”转换为“System.Collections.Generic.IEnumerable” 使用(arr); } 上面示例中的CreateRange方法是CreateRange(IEnumerable)重载。因为Span没有实现任何接口,所以我们不能进行此调用

假设我有如下方法:

不安全的无效转换(字节*ptr,整数长度)
{
var span=新的span(ptr,长度);
var arr=ImmutableArray.CreateRange(span);//错误:无法从“System.span”转换为“System.Collections.Generic.IEnumerable”
使用(arr);
}
上面示例中的
CreateRange
方法是
CreateRange(IEnumerable)
重载。因为Span没有实现任何接口,所以我们不能进行此调用是有道理的。但实际上我有点困惑,不知道该怎么做。是否有一些惯用的方法从一个跨度创建一个不可变数组,而复制/分配最少?(即,使用
Span.ToArray()
然后使用
ImmutableArray.ToImmutableArray()
将不理想)

如果您有任何建议,包括以某种方式直接使用指针+长度,我们也将不胜感激。

目前(截至2021年6月)正在讨论为此添加API

在此之前,问题建议使用以下生成器:

静态ImmutableArray ImmutableArrayFromSpan(只读span)
{
var builder=ImmutableArray.CreateBuilder(span.Length);
foreach(跨度中的var i){
增加(i);
}
返回builder.MoveToImmutable();
}

不幸的是没有,因为
ImmutableArray
没有
Span
构造函数。你得复印两份。但是它应该很快,因为
ToArray
知道预先的大小,所以只需要一个额外的分配。