csharplang 6045 https://github.com/dotnet/csharplang/blob/main/proposals/csharp-14.0/null-conditional-assignment.md `x?.X = v;` が `if (x != null) x.X = v;` に。 `=` 演算子の優先順位の低さを考えると `(x?.X) = v;` っぽく見えて気持ち悪いものの、需要は高いので。 式の途中に書くのも、右辺側ならできそう(`var y = (x?.X = v);` とかできちゃう。 `x` が null なら `y` も null)。 複合代入も可。 ```cs var a = new A { X = new() }; for (int i = 0; i < 100; i++) { a.X?.Value += 1; a.Y?.Value += 1; } Console.WriteLine(a.X?.Value); Console.WriteLine(a.Y?.Value); class Count { public int Value; } class A { public Count? X; public Count? Y; } ```
Activity
ufcpp commentedon Sep 23, 2025
https://ufcpp.net/study/csharp/rm_nullusage.html を修正
このページ、 NRT アノテーションつける作業してもいいかも。
今、戻り値なしの
x?.M();の話ない。「null が来たら null を返す」のところ「非 null の時だけ呼ぶ」も足したい。
「null 許容型」は「null 許容値型」に書き換えといた方がよさそう。
戻り値なし
x?.M();ができるんだったらそれとの整合性としてはx?.X = value;できる方が整合性はある。一方で、代入ってすっごい結合順位低いんで、(疑似的に)
x?(.X = value);相当の解釈になるの多少きもくはある。特にイベントで
if (x != null) x.Event += handler;はやるかも?x?.Event += handler;でできるように。ちゃんとショートサーキット。
は以下相当。
一度変数に(ref じゃなく) 受けるようなコードになるので、null 許容値型に対しては使えない。
インクリメント、デクリメントも不可。
ufcpp commentedon Nov 14, 2025
イベントの += はだいぶよさげな用途な雰囲気。
ufcpp commentedon Dec 20, 2025
https://ufcpp.net/study/csharp/cheatsheet/ap_ver14/#null-conditional-assignment
https://ufcpp.net/study/csharp/rm_nullusage.html#null-conditional-assignment