C Sharp
一時的に使用される型を簡単に定義するための匿名型が導入された。以下に例を挙げる:
上の式は、以下の内容のクラスを暗黙に定義する。定義されたクラスは匿名であるが故にプログラマは参照できない。
同じ型、同じ名前のプロパティを同じ順序で並べた匿名型は同じであることが保証されている。即ち、以下のコード:
において、her.GetType() == him.GetType() は true である。
自動実装プロパティの初期化子
get のみの自動実装プロパティおよびコンストラクタ代入
静的 using ディレクティブ
インデックス初期化子
catch/finally での await
例外フィルタ
式形式のメンバー (expression-bodied members)
null条件演算子
文字列補間(テンプレート文字列)
nameof 演算子
#pragma
コレクションの初期化子での拡張メソッド
オーバーロード解決の改善
さまざまな意味において、基盤であるCLIの機能をもっとも反映している言語であるといえる。C#にある組み込み型のほとんどは、CLIフレームワークに実装されている値型と対応している。しかし、C#の言語仕様はコンパイラのコード生成については何も言及していないため、CLRに対応しなければならないとか、共通中間言語 (CIL) などの特定のフォーマットのコードを生成しなければならないとかいうことは述べられていない。そのため、理論的にはC++やFORTRANのように環境依存のマシン語を生成することも可能である。しかし、現在存在するすべてのC#コンパイラはCLIをターゲットにしている。
属性の型が型引数を持てる様になった。
参照型にnull許容性を指定できるようになった。参照型の型名に?を付加した場合にnull許容参照型となる。
参照型の型名に?を付加しない場合、null非許容参照型となる。
フロー解析レベルでのnull許容性チェックが行われる。null許容値型のNullable<T>のような新しい型は導入されない。
null許容コンテキスト
参照型のnull許容性は、null許容コンテキストによって有効、無効の切り替えが可能である。 C#7.3以前の互換性のために、既定では無効となっている。
Nullable コンパイルオプション: プロジェクト全体でのnull許容コンテキストを指定する
#nullable ディレクティブ: ソースコードの部分ごとにnull許容コンテキストを指定する annotations オプション、warningsオプションにより、適用範囲を限定できる
null免除演算子
null許容参照型の変数名の後に !を使用することで、フロー解析時の警告が免除される。
C# 10.0で追加された仕様は以下の通り。

レコード構造体
構造体型の機能強化
補間された文字列ハンドラー
global using ディレクティブ
ファイル スコープの名前空間の宣言
拡張プロパティのパターン
ラムダ式の機能強化
const 補間文字列を許可する
レコードの型で ToString() を封印できる
限定代入の機能強化
同じ分解で代入と宣言の両方を許可する
メソッドで AsyncMethodBuilder 属性を許可する
CallerArgumentExpression 属性
拡張 #line pragma
警告ウェーブ 6
分解、out引数、パターンマッチングで、値の破棄を明示するために_が利用できるようになった。 破棄された値は、後で参照することはできない。