Visual Studio と C#、および、フレームワーク(プラットフォーム)の関係
はじめに
投稿記事サンプルコードは、Visual Studio Community 2022 を利用して、.NET 8 と .NET Framework 4.8 で確認しています。
Visual Studio 2022(17.12)としては、C# 13.0 をサポートしていますが、.NET Framework 4.8 は C# 7.3 が既定となっているため、サンプルコードは C# 7.3 機能範囲で記述しています。
上記のような関係があるので、Visual Studio と C#、および、フレームワーク(プラットフォーム)の関係についてまとめてみたいと思います。
ライフサイクル
Visual Studio
製品名 | 最終アップデート | 開始日 | 延長サポート終了日 |
---|---|---|---|
Visual Studio 2022 | - | 2021-11-08 | 2032-01-13 |
Visual Studio 2019 | 16.11 | 2019-04-02 | 2029-04-10 |
Visual Studio 2017 | 15.9 | 2017-03-07 | 2027-04-13 |
Visual Studio 2015 | Update 3(14.0.25431.01) | 2015-07-20 | 2025-10-14 |
Visual Studio 2013 | Update 5(12.0.40629.00) | 2014-01-15 | 2024-04-09 |
Visual Studio 2012 | Update 5(11.0.61030.00) | 2012-10-31 | 2023-01-10 |
フレームワーク
フレームワークのライフサイクルは、.NET Framework と .NET に記載しているので、そちらをご確認ください。
Visual Studio と C# の関係
C# バージョンと新機能
C Sharp (programming language) - Wikipedia
C# の歴史 | Microsoft Learn
C# によるプログラミング入門 | ++C++; // 未確認飛行 C
【C#】バージョン間の隠れた機能変更と互換性の罠
Visual Studio | C# | C# 新機能(抜粋) |
---|---|---|
Visual Studio 2022 17.12 | 13.0 | params コレクション、 Lock クラスに対する lock |
Visual Studio 2022 17.8 | 12.0 | プライマリ コンストラクタ、コレクション式、InlineArray |
Visual Studio 2022 17.4 | 11.0 | 生文字列リテラル、required メンバー、リスト パターン |
Visual Studio 2022 17.0 | 10.0 | record struct、global using、ファイルスコープ名前空間 |
Visual Studio 2019 16.8 | 9.0 | レコード型、init-only プロパティ、トップレベルステートメント |
Visual Studio 2019 16.3 | 8.0 | null 許容参照型、null 合体代入、switch 式、範囲アクセス |
Visual Studio 2017 15.7 | 7.3 | タプルの ==, != 比較、ref 再代入、stackalloc 初期化子 |
Visual Studio 2017 15.5 | 7.2 | 先頭区切り文字、private protected、readonly struct |
Visual Studio 2017 15.3 | 7.1 | 非同期 Main、default 式、タプル要素名の推論 |
Visual Studio 2017 15.0 | 7.0 | タプル、型スイッチ、ローカル関数、throw 式 |
Visual Studio 2015 | 6.0 | null 条件演算子、nameof 演算子、文字列補間、using static |
Visual Studio 2012 / 2013 | 5.0 | async/await |
Visual Studio と フレームワークの関係
Visual Studio プロジェクトで、ターゲットとして指定可能なフレームワークを記載します。
.NET
Visual Studio | .NET |
---|---|
Visual Studio 2022 17.12 | 5.0、6.0、7.0、8.0、9.0 |
Visual Studio 2022 17.7 | 5.0、6.0、7.0、8.0 |
Visual Studio 2022 17.2 | 5.0、6.0、7.0 |
Visual Studio 2022 17.0 | 5.0、6.0 |
Visual Studio 2019 16.8 | 5.0 |
.NET Framework
Visual Studio | .NET Framework |
---|---|
Visual Studio 2022 17.0 | 4.6.2 以降 |
Visual Studio 2019 16.0 | 3.5(2.0, 2.5 内包)、4.0、4.5、4.6、4.7、4.8 |
Visual Studio 2017 15.9 | 3.5(2.0, 2.5 内包)、4.0、4.5、4.6、4.7、4.8 |
Visual Studio 2017 15.0 | 3.5(2.0, 2.5 内包)、4.0、4.5、4.6、4.7 |
Visual Studio 2015 | 3.5(2.0, 2.5 内包)、4.0、4.5、4.6 |
Visual Studio 2013 | 3.5(2.0, 2.5 内包)、4.0、4.5 |
Visual Studio 2012 | 3.5(2.0, 2.5 内包)、4.0、4.5 |
フレームワークと C# の関係
フレームワークの C# 既定バージョン
Visual Studio プロジェクト生成時、対象フレームワークによって、下記、C# 既定バージョンが選択されます。
フレームワーク | C# 既定バージョン |
---|---|
.NET 9.x | C# 13 |
.NET 8.x | C# 12 |
.NET 7.x | C# 11 |
.NET 6.x | C# 10 |
.NET 5.x | C# 9.0 |
.NET Core 3.x | C# 8.0 |
.NET Core 2.x | C# 7.3 |
.NET Standard 2.1 | C# 8.0 |
.NET Standard 2.0 | C# 7.3 |
.NET Standard 1.x | C# 7.3 |
.NET Framework 全て | C# 7.3 |
C# バージョン設定
Visual Studio IDE からは C# バージョン設定はできませんが、プロジェクトファイルをテキストエディタで編集することで、C# バージョンを指定することが可能です。
<PropertyGroup>
<LangVersion>13.0</LangVersion>
</PropertyGroup>
.NET
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-versioning
C# 13 は、.NET 9 以降のバージョンでのみサポートされています。 C# 12 は、.NET 8 以降のバージョンでのみサポートされています。 C# 11 は、.NET 7 以降のバージョンでのみサポートされています。
C# 新機能にあわせて、.NET 機能強化も実施しているため、上記を前提としています。
.NET 機能強化に依存しない機能であれば、「C# バージョン設定」手順を利用することで利用可能となります。
具体例として、「C# 11 新機能 - UTF-8 リテラル」で確認してみます。
.NET 6.0 - C# 10 の環境で、下記コードを、ビルドしてみます。
ReadOnlySpan<byte> span = "Hoge"u8; // UTF-8 リテラル
var sb = new StringBuilder();
foreach (var c in span)
{
sb.Append(string.Format("0x{0:X2} ", c));
}
textBox1.Text = sb.ToString().TrimEnd();
機能 'UTF-8 文字列リテラル' は C# 10.0 では使用できません。言語バージョン 11.0 以上を使用してください。
「C# バージョン設定」手順で C# 11 に変更すると、ビルドでき、実行も問題ありません。
.NET Framework
「C# バージョン設定」手順で C# バージョンを設定できますが、.NET に依存する機能については、.NET Framework では同等には利用できないケースがあります。
例えば、「C# 11 新機能 - UTF-8 リテラル」は、ReadOnlySpan<byte>
オブジェクトを利用しますが、.NET Framework では、ReadOnlySpan<T>
自体がサポートされていません。
例えば、「C# 11 新機能 - Generic Math」は、「C# バージョン設定」手順で C# 11 に変更しても、.NET Framework では利用できません。
static T Sum<T>(IEnumerable<T> items) where T : INumber<T>
{
var sum = T.Zero;
foreach (var x in items) sum += x;
return sum;
}
int sum = Sum(new int[] { 1, 2, 3, 4, 5 });
- ビルドエラー内容
- 'T' で非 virtual メンバー参照を実行できません。これは型パラメーターであるためです
- 型 'int' はジェネリック型またはメソッド 'Form1.Sum<T>(IEnumerable<T>)' 内で型パラメーター 'T' として使用できません。'int' から 'INumber<int>' へのボックス変換がありません
- 型または名前空間の名前 'INumber<>' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)
出典
本記事は、2025/03/10 Qiita 投稿記事の転載です。
Discussion
とありますが、.NET Frameworkで利用できない例としては適切でないと思います。
より適切な例としては、ランタイムの対応が必要でpolyfillや追加ライブラリでは対応されない、
C#11のGeneric MathやC#8のデフォルトinterfaceメソッドなどの方が例としては適切かと思います。
ご指摘ありがとうございます。
ご指摘内容で記事を更新させて頂きました。