Supongamos que tengo un método como el siguiente:
unsafe void Convert(byte* ptr, int length) { var span = new Span<byte>(ptr, length); var arr = ImmutableArray.CreateRange(span); // error: cannot convert from 'System.Span<byte>' to 'System.Collections.Generic.IEnumerable<byte>' Use(arr); } El método CreateRange del ejemplo anterior es la CreateRange<T>(IEnumerable<T>) . Dado que Span no implementa ninguna interfaz, tiene sentido que no podamos realizar esta llamada. Pero en realidad estoy un poco perplejo en cuanto a qué hacer en su lugar. ¿Hay alguna forma idiomática de crear un ImmutableArray a partir de un Span con una copia/asignación mínima? (es decir, usar Span<T>.ToArray() y luego ImmutableArray<T>.ToImmutableArray() no sería ideal)
También agradecería cualquier sugerencia que implique usar el puntero + longitud directamente de alguna manera.
Hay un problema abierto (a partir de junio de 2021) sobre cómo agregar API para esto.
Hasta entonces, el problema sugiere usar un constructor como este:
static ImmutableArray<T> ImmutableArrayFromSpan<T>(ReadOnlySpan<T> span) { var builder = ImmutableArray.CreateBuilder<T>(span.Length); foreach (var i in span) { builder.Add(i); } return builder.MoveToImmutable(); }