合わせて C# 12 が使えるようになったようです
新記法が追加されたようで 少しスクリプト言語に近づきました
int[] nums = [1, 2];
という感じで [] のリテラルで配列を作れます
JavaScript や PHP や Python などの言語に近い感じで書けます
配列以外のリストやセットなどでもいいです
List<string> strs = ["foo", "bar"];
HashSet<int> hs = [1, 2];
ネストもできます
int[][] n = [[1, 2], [2, 3]];
List<List<List<int>>> ll = [[[1], [2]], [[3], [4]]];
展開もできます
int[] ii = [.. i, .. i];
この記法は JavaScript や PHP と似てるようで違って紛らわしいです
... じゃなくて .. ですし フォーマットすると変数名の間にスペースができます
Range のリテラルに使う .. を使いまわしてるみたいです
var r = 1..10;
展開自体はこれまでの new [] { 1, 2 } の記法のときからできたのかと思いましたが できないようでした
今でもエラーになります
var error = new[] { ..i };
色々できて便利ですが Dictionary は対応していないようです
Dictionary<string, bool> flags = [["foo", false], ["bar", true]];
これはエラーでした
KeyValuePair を入れる方法も試しましたがダメでした
var kvp = new KeyValuePair<string, bool>("foo", false);
Dictionary<string, bool> flags = [kvp];
'value' の必要なパラメーター 'Dictionary<string, bool>.Add(string, bool)' に対応する特定の引数がありません
って言われます
Dictionary の場合は Add で key と value の 2 つの引数を取る形になりますが この記法で書くと KeyValuePair の 1 つを渡すようになってしまって引数が足りてないとみなされているようです
なので Dictionary を使う場合は まだこれまでの記法で書く必要があります
var flags = new Dictionary<string,bool> { ["foo"] = false, ["bar"] = true };
一見便利な新機能ですが 個人的に不満もあって var が使えません
左辺に型を明示的に書く必要があります
右辺だけだと List なのか配列なのかわからないので仕方ないのですが C 系の 「型を文の最初に書く」 記法は読みづらいので好きになれません
変数宣言だとわかるように 文は var など固定の文字列で始めたいです
int 等のシンプルな型ならまだいいですが 長めの型になるとこれが変数宣言だとわかるまで少し時間がかかって読みづらいです
一応 右辺でキャストすれば左辺は var でも通るのですが 無理矢理感もあってこれでいいのか不安な感じもします
これまでの記法とあまり変わらないですし
var nums = (int[])[1, 2];
var ll = (List<List<List<int>>>)[[[1], [2]], [[3], [4]]];