たまカーチャンのお部屋(さんでーぷろぐらま館)

仕様変更も納期も関係ない 趣味の素人タマさんの悪戦苦闘ぷろぐらみんぐBLOG

順調に増えてる増えてる

今日またアップデートがきました。

Visual Studio 2022 17.0.0 Preview 4.1

例によってスタックトレース吐きまくりなのはいいとして(いいのか?)、いい加減これはどうにかして欲しい項目がこれ(MS報告済み)

リストに出力命令を格納するというコード(デリゲートのサンプル)なのですが、まあそのまま書けばこんな感じでしょうか

            var nums = new List<string> { "ONE", "TWO", "THREE" };
            var actions = new List<Action>();

            foreach (var n in nums) {
                actions.Add(() => { Console.WriteLine(n); });
            }

このコードのforeachのところにカーソルを持って行くと、修正候補として

f:id:tamaka:20210924075515p:plain
リファクタリング候補

と表示され、〝呼び出し形式へ変換〟を指定した場合こうなります。

            var nums = new List<string> { "ONE", "TWO", "THREE" };
            var actions = (nums.Select(n => () => { Console.WriteLine(n); })).ToList();

……当然こんなものはコンパイルできません。
これをチェーンメソッドに変換するとしたら

            var nums = new List<string> { "ONE", "TWO", "THREE" };
            var actions = nums.Select(n => (Action)(() => Console.WriteLine(n))).ToList();

あたりが無難かと思います。

修正を提案してくるくらいならせめてシンタックスエラーが出るようなものに変換するんじゃない~

余談:チェーンメソッドというものは、慣れたら大したことじゃないんですが、まあ読みづらいと言えば読みづらいので、私が書くとすれば↓のようになるんじゃないかなと*1

            var nums = new string[] { "ONE", "TWO", "THREE" };
            var actions =
                from n in nums
                select (Action)(() => Console.WriteLine(n));

          //actions.ForEach(delegate (Action action) { action(); });
            actions.ForEach(action => action());

私は、昨日書いたようにLINQ大好きですけど、クエリ式で書けるものはクエリ式で書く方が見易いと思います。
伊達にクエリ式がシンタックスシュガーと呼ばれているわけではないということで。
……クエリ式でどうやっても書けないものはあるので、適材適所の併用が吉かと(^^)

*1:今は最後の行のような書き方ができるから楽ですけど、以前はその1行上のコメントみたいな書き方だったんですよねぇ……