rksoftware

Visual Studio とか C# とかが好きです

C# 14 の情報を振り返る その6 / C# 14 (.NET 10 世代の C# ) 暗黙的なスパン変換 / implicit-span-conversions

C# 14 (.NET 10 世代の C# ) の機能、暗黙的なスパン変換 / implicit-span-conversions を見てみます。

■ これまでは

配列を Span で受ける拡張メソッドを作成できませんでした。

■ これからは

配列を Span で受ける拡張メソッドを作成できます。

■ コードで例

// これは以前からできた
new int[] { }.M1();

// これができるようになった
new int[] { }.M2();
new int[] { }.M3();
// Preview バージョンを指定していない場合のエラー
// 'int[]' に 'M2' の定義が含まれておらず、型 'int[]' の最初の引数を受け付けるアクセス可能な拡張メソッド 'M2' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください

// 拡張メソッドの定義
internal static class Ex
{
    public static void M1<T>(this IEnumerable<T> enu) {; }
    public static void M2<T>(this Span<T> span) {; }
    public static void M3<T>(this ReadOnlySpan<T> span) {; }
}

■ ReadOnlySpan の共変

ReadOnlySpan で共変ができるようになりました。共変、あまり話題にならない機能です。使う機会もあまりないですから忘れがちな機能です。言葉で説明するよりコードの方がわかりやすいと思うので、多くは語らずコードで示します。

// これはできない
List<object> list = new List<string>();
Span<object> span1 = new Span<string>();
// 型 'System.Collections.Generic.List<string>' を 'System.Collections.Generic.List<object>' に暗黙的に変換できません
// 型 'System.Span<string>' を 'System.Span<object>' に暗黙的に変換できません

// これができるようになった
ReadOnlySpan<object> span2 = new ReadOnlySpan<string>();
// Preview バージョンを指定していない場合のエラー
// 型 'System.ReadOnlySpan<string>' を 'System.ReadOnlySpan<object>' に暗黙的に変換できません

■ 今回のコード

GitHub に上げています。

github.com

■ 備えよう

新機能、いいですね。リリースに備えましょう。