rksoftware

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

C# 13 の新機能を試す params その2

C# 13 でパワーアップする params を試してみました。

rksoftware.hatenablog.com

しかし、いろいろと気になるところがある......そう思っていますね。いいでしょう試してみましょう。

C.M(1, 2);                                              // 1:Int32[] => 1,2
C.M('a', 'b');                                          // 3:List`1 => a,b
C.M(new[] { 1, 2 });                                    // 1:Int32[] => 1,2
C.M(new System.Collections.Generic.Queue<string>());    // 3:List`1 => System.Collections.Generic.Queue`1[System.String]
C.M(new List<int> { 1, 2 });                            // 3:List`1 => 1,2
// C.M(new []{'a', 'b' }.AsSpan());    // CS1503 引数 1: は 'System.Span<char>' から 'int' へ変換することはできません

static class C
{
    public static void M(params int[] a) => Console.WriteLine($"1:{a.GetType().Name} => {string.Join(",", a)}");
    // これができるようになった
    // .csproj に <!->LangVersion>Preview</LangVersion>
    //  CS8652 機能 'params コレクション' は現在、プレビュー段階であり、*サポートされていません*。プレビュー機能を使用するには、'preview' 言語バージョンを使用してください。
    public static void M<T>(params IEnumerable<T> a) => Console.WriteLine($"2:{a.GetType().Name} => {string.Join(",", a)}");
    public static void M<T>(params List<T> a) => Console.WriteLine($"3:{a.GetType().Name} => {string.Join(",", a)}");
}

配列で受けられるものは配列で受けて、そうでないものは List になっていますね。IEnumerable にできる Queue も List<Queue> として List で受けるようです。

では、List で受けるメソッドがなかったらどうなるか

C.M(1, 2);                                              // 1:Int32[] => 1,2
C.M('a', 'b');                                          // 2:<>z__ReadOnlyArray`1 => a,b
C.M(new[] { 1, 2 });                                    // 1:Int32[] => 1,2
C.M(new System.Collections.Generic.Queue<string>());    // 2:Queue`1 =>
C.M(new List<int> { 1, 2 });                            // 2:List`1 => 1,2
// C.M(new []{'a', 'b' }.AsSpan());    // CS1503 引数 1: は 'System.Span<char>' から 'int' へ変換することはできません

static class C
{
    public static void M(params int[] a) => Console.WriteLine($"1:{a.GetType().Name} => {string.Join(",", a)}");
    // これができるようになった
    // .csproj に <!->LangVersion>Preview</LangVersion>
    //  CS8652 機能 'params コレクション' は現在、プレビュー段階であり、*サポートされていません*。プレビュー機能を使用するには、'preview' 言語バージョンを使用してください。
    public static void M<T>(params IEnumerable<T> a) => Console.WriteLine($"2:{a.GetType().Name} => {string.Join(",", a)}");
    // public static void M<T>(params List<T> a) => Console.WriteLine($"3:{a.GetType().Name} => {string.Join(",", a)}");
}

値で受けたものは z__ReadOnlyArray に、Queue もそのまま Queue がわたっていますね。

■ こんなコードは書かないともいますけど

結構動作を予見するのが難しそうです。けど使いこなすととてもイイ! 意識してうまく使いこなしましょう。