C# 13 でパワーアップする params を試してみました。
しかし、いろいろと気になるところがある......そう思っていますね。いいでしょう試してみましょう。
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
では、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
■ こんなコードは書かないともいますけど
結構動作を予見するのが難しそうです。けど使いこなすととてもイイ! 意識してうまく使いこなしましょう。