【C#】ListをAsSpanしたい

ハック的な手法で List に AsSpan の拡張メソッドをは生やすことができますが、.NET5からは標準ライブラリでサポートされたので両対応してみます。

public static class ListExtensions
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static Span<T> AsSpan<T>(this List<T> self)
    {
#if NET5_0_OR_GREATER
        return System.Runtime.InteropServices.CollectionsMarshal.AsSpan(self);
#else
        // Hacked!!!!
        return Unsafe.As<ListDummy<T>>(self).Items.AsSpan(0, self.Count);
#endif
    }

    private class ListDummy<T> { internal T[] Items; }
}

// 使い方
List<int> list = new() { 1, 2, 3, 4, 5 };
Span<int> span = list.AsSpan();

まぁもう .NET5 以前環境はあまり無いと思いますが、、、