C Sharp
ラムダ式が導入された。この名前はラムダ計算に由来する。
以下の匿名メソッド
は、ラムダ式を使って次のように記述できる:
ラムダ式は匿名メソッドと同様に扱えるが、式形式のラムダがExpression<TDelegate>型として扱われた場合のみ匿名メソッドとして扱われず、コンパイラによって式木を構築するコードに変換される。匿名デリゲートが実行前にコンパイルされたCILを保持するのに対し、式木はCILに実行時コンパイル可能であるDOMのような式の木構造そのものを保持する。これはLINQクエリをSQLクエリなどに変換する際に役立つ。
以下は、3つの任意の名前の変数、整数、括弧、及び四則演算子のみで構成された式を逆ポーランド記法に変換する汎用的なコードである:
同一アセンブリ内、かつ、継承先からのアクセス許可を表すprivate protectedアクセス修飾子が追加された。
C# 9.0で追加された仕様は以下の通り。

レコード
プロパティのinitアクセサ
最上位レベルステートメント
パターンマッチングの拡張
new式の型推論
条件演算子の型推論
共変戻り値
GetEnumeratorの拡張メソッド対応
静的匿名関数
ラムダ式引数の破棄
ローカル関数への属性適用
パフォーマンスと相互運用 ネイティブサイズの整数型(nint nuint型) 関数ポインタ(delegate*型) 変数初期化フラグの抑制
コードジェネレータのサポート モジュール初期化子 部分メソッドの拡張
VBやC++に実装されているオプション引数・名前付き引数が、C#でも利用できるようになった。
部分型 (Partial Type) が導入された。以下のようにクラスや構造体の宣言にpartial修飾子をつけることで、その宣言を分割することができる。
これは以下と同義である:
これによって、巨大なクラスを分割したり、自動生成されたコードを分離したりすることができる。partial 修飾子はすべての宣言につける必要がある。
catchの後にwhenキーワードを使用することで、処理する例外を限定することができるようになった。
匿名メソッド
External Aliases/Namespace Aliases Qualifiers
プラグマディレクティブ/C言語の様な固定長の配列表記Fix Size Buffers
値型におけるパフォーマンス向上を意図した複数の機能が追加された。
in参照渡し、ref readonly参照戻り値
引数にinを指定することで、読み取り専用参照渡しを指定できる。 また、戻り値にref readonlyを指定することで、読み取り専用参照戻り値を指定できる。
これにより、構造体のコピーを避けると共に、意図しない値の変更を抑止できる。
readonly構造体
構造体宣言時にreadonlyを指定することで、真の読み取り専用構造体を定義できる。 readonly構造体の全てのフィールドはreadonlyでなければならず、thisポインタも読み取り専用となる。
これにより、メンバーアクセス時の意図しない防御的コピーを抑止できる。
ref構造体
構造体宣言時にrefを指定することで、ヒープ領域へのコピーを防ぐ構造体がサポートされる。 ref構造体では、box化できない、配列を作成できない、型引数になることができない、など、ヒープ領域へのコピーを防ぐための厳しい制限がかかる。
この機能は、Span<T>のような構造体をサポートするために利用され、unsafe文脈以外でのstackallocの利用をも可能とする。