C# 15 には、次の新機能が含まれています。 最新の Visual Studio 2026 Insiders バージョンまたは .NET 11 プレビュー SDK を使用して、これらの機能を試してください。
C# 15 は、最新の C# プレビュー リリースです。 .NET 11 プレビュー バージョンでは、C# 15 がサポートされています。 詳細については、C# 言語のバージョン管理 を参照してください。
最新の .NET 11 プレビュー SDK は 、.NET ダウンロード ページからダウンロードできます。 .NET 11 プレビュー SDK を含む Visual Studio 2026 Insider をダウンロードすることもできます。
[C# の新機能] ページでは、パブリック プレビュー リリースで使用できる新機能が追加されます。 roslyn 機能ステータス ページのワーキング セット セクションは、今後の機能がメイン ブランチにマージされたときに追跡します。
C# 15 で導入された破壊的変更については、破壊的 変更に関する記事を参照してください。
注
これらの機能に関するフィードバックに関心があります。 これらの新機能のいずれかに問題がある場合は、dotnet/roslyn リポジトリに新しい問題を作成します。
コレクション式の引数
with(...)要素をコレクション式の最初の要素として使用することで、基になるコレクションのコンストラクターまたはファクトリ メソッドに引数を渡すことができます。 この機能を使用すると、容量、比較子、またはその他のコンストラクター パラメーターをコレクション式の構文内で直接指定できます。
次の例は、容量引数を List<T> コンストラクターに渡し、比較子を HashSet<T>に渡す方法を示しています。
string[] values = ["one", "two", "three"];
// Pass capacity argument to List<T> constructor
List<string> names = [with(capacity: values.Length * 2), .. values];
// Pass comparer argument to HashSet<T> constructor
HashSet<string> set = [with(StringComparer.OrdinalIgnoreCase), "Hello", "HELLO", "hello"];
// set contains only one element because all strings are equal with OrdinalIgnoreCase
コレクション式の引数の詳細については、コレクション式または機能の仕様に関する言語リファレンス記事を参照してください。 コレクション初期化子でコレクション式引数を使用する方法については、「 オブジェクト初期化子とコレクション初期化子」を参照してください。
ユニオン型
C# 15 では、複数のケース型の 1 つである値を表す 共用体型が導入 されています。
union キーワードを使用して共用体を宣言します。
public record class Cat(string Name);
public record class Dog(string Name);
public record class Bird(string Name);
public union Pet(Cat, Dog, Bird);
共用体は各ケースの型からの暗黙の型変換を提供し、コンパイラはすべてのケース型にわたって switch 式が網羅的であることを保証します。
Pet pet = new Dog("Rex");
string name = pet switch
{
Dog d => d.Name,
Cat c => c.Name,
Bird b => b.Name,
};
ランタイムには、.NET 11 Preview 5 以降の UnionAttribute 型と IUnion 型が含まれています。
提案仕様の一部の機能はまだ実装されていません。 これらの機能は、将来のプレビューで提供される予定です。
詳細については、言語リファレンスまたは機能仕様の共用体の型を参照してください。
閉じた階層
C# 15 以降では、 closed 修飾子をクラスに適用して 、閉じた階層を宣言できます。 閉じたクラスは、コンパイル時に直接子孫のセットを修正する宣言アセンブリ内からのみ派生できます。
public closed record class GateState;
public record class Closed : GateState;
public record class Open(float Percent) : GateState;
コンパイラはすべての直接の子孫を認識するため、各子孫を処理する switch 式は完全であり、既定の arm は必要ありません。
string Describe(GateState state) => state switch
{
Closed => "closed",
Open(var percent) => $"{percent}% open",
// No warning: every direct descendant of 'GateState' is handled.
};
closed修飾子はコンテキスト キーワードです。
closed クラスは暗黙的にabstractされ、sealed、static、または明示的なabstract修飾子と組み合わせることはできません。 派生は推移的ではありません。閉じたクラスの非閉じた子孫は、他のアセンブリから派生できます。 階層の下位まで網羅性チェックを拡張するには、中間の派生型 closed にもマークを付けます。
注
C# 15 プレビュー 5 のランタイムには、まだ System.Runtime.CompilerServices.ClosedAttribute は含まれていません。 それが行われるまで、 closed 修飾子を使用するすべてのプロジェクトは、属性自体を宣言する必要があります。
namespace System.Runtime.CompilerServices;
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class ClosedAttribute : Attribute { }
詳細については、言語リファレンスの クローズド修飾子 と Closed 階層パターン 、または 機能仕様を参照してください。 このセクションの例 (ClosedAttribute 回避策など) は、 GitHub リポジトリの dotnet/docsからコピーできます。
メモリの安全性
C# 15 では、言語でのメモリの安全性を再定義するためのマルチリリース作業が開始されます。 目標は、ポインター型の存在ではなく、実際にアンマネージ メモリにアクセスする操作に unsafe コンテキストを関連付けすることです。 ほとんどのメモリ安全性の脆弱性はこれらのアクセス操作に由来するため、この言語ではレビュー担当者や監査担当者がそれらを見つけやすいように目立たせています。
完全なモデルでは、unsafe がメンバーに付いていると、そのメンバーは requires-unsafe としてマークされます。監査義務は呼び出し元に移り、呼び出し元は unsafe コンテキスト内でそのメンバーを使用しなければなりません。 アセンブリはこの適用をオプトインし、コンパイラは選択を System.Runtime.CompilerServices.MemorySafetyRulesAttribute 属性で記録します。 また、このモデルでは、safeメンバーと明示的レイアウト フィールドを安全としてマークするexternコンテキスト キーワードも追加されます。 これらの規則によって、プログラム全体にわたって、メモリ安全性が損なわれる可能性のある境界が明示的になります。
最初の手順には、ポインターの緩和が含まれます。
preview言語バージョンでコンパイルする場合、次の操作ではunsafeコンテキストは不要になります。
- ポインター型を宣言し、
&演算子を使用して変数のアドレスを取得します。 - 変数をピン留めする
fixedステートメント。 -
stackalloc式をポインターに変換する。 - 任意のアンマネージド型に適用される
sizeof演算子。
次の例では、 unsafe コンテキストなしでポインターを作成してピン留めします。
int number = 42;
int* pointer = &number;
int[] numbers = [10, 20, 30];
fixed (int* first = numbers)
{
// Dereferencing the pointer still requires an unsafe context.
}
ポインター間接参照 (*p)、ポインター メンバー アクセス (p->member)、ポインター要素アクセス (p[i])、関数ポインター呼び出しなど、ポイント先のメモリにアクセスする操作には、引き続き unsafe コンテキストが必要です。
requires-unsafe メンバー モデル、更新されたメモリ安全規則へのアセンブリ オプトイン、および safe コンテキスト キーワードは、後のプレビューで提供されます。
詳細については、言語リファレンスまたは機能仕様の安全でないコード、ポインター型、および関数ポインターを参照してください。
こちらも参照ください
.NET 11
.NET