6月くらいからの C# Design Notes 追加。

いくつかは、提案文書の方が先に出てたので、先にブログを書いてあるものの原案みたいなもの。

その他に関して。

nullable reference types

  • May 30
    • 「アノテーションを何もつけていないと非 null 扱い」(unannotated reference types to be non-nullable; "URTANN")に関して
    • URTANN 動作の opt-out ができないと、C# 7.X 以前のコードが警告だらけになる
      • 現状の Roslyn にそのまま適用すると2000個くらいの警告が出るらしい
    • デフォルト挙動は URTANN(true) にしたい
    • 細かい粒度(特定のファイルだけ、特定のクラスだけ、特定のメソッドだけ)で URTANN の opt-in/out 切り替えができるようにしたい
    • 切り替えはたぶん属性でやる。NonNullTypesAttribute(bool)
  • Jun 4
    • ラムダ式にキャプチャした変数の null フロー解析、ちょっと特殊になりそう

式ツリー

式ツリーで使える文法を増やしたいという話は前々からあるものの、やっと検討が始まったっぽい。

前半は需要のあるシナリオについて。Big data に対するクエリを式ツリーで送りたいとか、機械学習ライブラリ方面で自動微分とか GPU 上でのコード実行したいとか。

後半は実現方法に関して。

  • 既存の、Entity Frameworkとかはノードを追加されても使えない。どのノードが使えるかはライブラリごとに異なる。どう制限するか
  • reduction (await をその展開結果である AsyncStateMachine の行動に変換したりとか、そういうノード変形)はやるかどうか
    • あまりしない方がよさそう
  • C# の最新機能全部に、式ツリーが常に100%追従しようとは思っていない

とか言う感じ。あと、一応、プロトタイプ実装あり。

Target-typed new

  • Jun 25
    • オーバーロード解決には寄与させないつもり
    • S? s = new (); みたいに書くとき、new S() の意味にする(new Nullable<S>()、つまり、null の意味にはしない)
    • new () は型を持たない。var x = new (); みたいなのは型が確定しなくてエラー
    • new () とか new {} とかは認めるけど、new 単体は認めないつもり
    • dynamic型がターゲットのnew ()も認めない

オーバーロードに関しては、例えば以下のような話。

struct S1 { public int x; }
struct S2 { }

void M(S1 s1) { }
void M(S2 s2) { }

void X()
{
    M(new() { x = 43 });
    //↑ x を持ってるのは S1 だけだから、S1 と推論できる
    // でも、それをやっちゃうと、S2 に後から x を追加することで破壊的変更が起きちゃう
    // なので、こういうオーバーロード解決はやらない
}

null 条件演算

?. とか ?? 系統の機能をいくつか追加。

  • x ??= y で、x = x ?? y;
  • await? t で、if (t != null) await t;
  • ポインターに対してもp?[a]p?->ap ?? q