[解決済み】C# 8は.NET Frameworkをサポートしていますか?
質問
Visual Studio 2019 Advanced Build 設定で、C# 8 は .NET Framework プロジェクトでは使用できず、.NET Core 3.0 プロジェクトでのみ(下の写真のように)使用できるようです。
C# 8は.NET Frameworkをサポートしていますか?
解決方法は?
はい、C# 8は.NET Frameworkで使用することができます。 など、.NET Core 3.0/.NET Standard 2.1より古いターゲットをVisual Studio 2019(または旧バージョンのVisual Studioであれば NuGet パッケージをインストールする ).
必要なのは、言語バージョンを
8.0
を csproj ファイルに記述してください。また、これは
ディレクトリ.ビルド.プロップス
を使用して、ソリューション内のすべてのプロジェクトに適用します。Visual Studio 2019のバージョン16.3以降で行う方法は以下をお読みください。
どのフレームワークを対象にしても、ほとんどの機能(すべてではありませんが)が利用できます。
動作する機能
以下の機能は、構文の変更のみで、フレームワークに関係なく動作します。
- 静的ローカル関数
- 宣言の使用
- Null-coalescing 代入
- 読み取り専用メンバー
- 使い捨ての参照構造体
- 位置決めパターン
- タプルのパターン
- スイッチ式
- Null可能な参照タイプ もサポートされていますが、新たに nullable属性 より複雑なNullableのユースケースを設計するために必要なものはありません。これについては、さらに下の「詳細情報」のセクションで詳しく説明します。
動作させることができる機能
これらは、.NET Frameworkにない新しい型が必要です。これらは、NuGet パッケージまたはコード ファイルと組み合わせて使用することができます。
デフォルトのインターフェース・メンバー - 動作しない、動作しない、そして動作しない
デフォルトのインターフェースメンバー は.NET Frameworkではコンパイルできず、CLRの実行時変更を必要とするため、決して動作しないでしょう。.NET Coreが今後の主流となるため、.NET CLRは現在凍結されています。
動作するもの、しないもの、ポリフィルの可能性については、Stuart Langの記事を参照してください。 C# 8.0 と .NET Standard 2.0 - サポートされていないことをする .
コード
.NET Framework 4.8 をターゲットとし、C# 8 の nullable 参照型を使用する次の C# プロジェクトは Visual Studio 16.2.0 でコンパイルできます。このプロジェクトは .NET 標準クラスライブラリ・テンプレートを選択し、代わりに .NET Framework をターゲットに編集して作成しました。
.csproj。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net48</TargetFrameworks>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
.cs:
namespace ClassLibrary1
{
public class Class1
{
public string? NullableString { get; set; }
}
}
次に、.NET Framework 4.5.2 WinForms プロジェクトで、レガシーな
.csproj
形式を使用し、同じ nullable reference type プロパティを追加しました。Visual Studio の詳細ビルド設定ダイアログ (16.3 では無効) で言語タイプを
latest
で、プロジェクトを保存しました。もちろんこの時点ではビルドされません。プロジェクトファイルをテキストエディタで開き
latest
を
preview
ビルド構成で
PropertyGroup
:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<LangVersion>preview</LangVersion>
次に、NULL可能な参照型のサポートを有効にするために
<Nullable>enable</Nullable>
に、メインの
PropertyGroup
:
<PropertyGroup>
<Nullable>enable</Nullable>
プロジェクトを再読み込みすると、ビルドされました。
ビジュアルスタジオ2019
C# 8.0のローンチバージョンであるVisual Studio 2019 バージョン16.3のRTM版では、言語選択のドロップダウンが無効化されるという大きな変更がありました。
マイクロソフトの 理性的 となっています。
今後、各フレームワークの各バージョンには、単一の サポートされるデフォルトのバージョンで、任意のバージョンをサポートすることはありません。 バージョンです。このサポート変更を反映させるため、このコミットでは以下を恒久的に行います。 言語バージョンのコンボボックスを無効化し、ドキュメントへのリンクを追加しました。 この変更を説明します。
開くドキュメントは C#言語のバージョン管理 . これには、.NET Core 3.x ONLY のデフォルト言語として C# 8.0 が記載されています。また、次のことも確認されています。 今後、各フレームワークの各バージョンでサポートされるバージョンとデフォルトのバージョンは1つになる予定です。 また、フレームワークに依存しない言語であることは、もはや信頼できない。
.NET Frameworkプロジェクトでは、.csprojファイルを編集することで、言語バージョンを8に強制することが可能です。
詳細
この回答が最初に書かれたとき、C# 8 はプレビュー版で、多くの探偵業が関わっていました。その情報を後世に残すためにここに残しておきます。もし、あなたが血なまぐさい詳細を知る必要がないのであれば、自由に読み飛ばしてください。
C#言語は、歴史的に ほとんどフレームワークに依存しない - つまり、古いバージョンのFrameworkをコンパイルすることができます。ただし、いくつかの機能では新しい型やCLRのサポートが必要でした。
C#の愛好家であれば、ほとんどの人がブログのエントリ C# 8.0のビルド Mads Torgersenによるもので、C# 8の特定の機能にはプラットフォーム依存性があることを説明しています。
<ブロッククオート非同期ストリーム、インデクサ、レンジはすべて新しいフレームワークタイプに依存しています。 .NET Standard 2.1や.NET Core 3.0に含まれる予定の Xamarin、Unity、Monoはすべて.NET Standard 2.1を実装する予定ですが、.NET Framework 4.8は対象外です。つまり これらの機能は、.NET Framework 4.8では使用できません。
これは少し似ています
値のタプル
はC# 7で導入されました。この機能には新しい型が必要でした。
ValueTuple
構造体は、.NET Framework 4.7以下や.NET Standard 2.0以下では使用できません。
しかし
C# 7は、古いバージョンの.NETでも、値タプルなし、または値タプルをインストールすることで使用可能です。
System.ValueTuple Nuget パッケージ
. Visual Studioはこれを理解し、すべてうまくいったのです。
しかし、マッズはこうも書いている。
このため、C# 8.0の使用は、.NET Standard 2.1を実装したプラットフォームでのみサポートされています。
...これが本当なら、C# 8 を使って いずれも また、つい最近ライブラリコードのベースライン・ターゲットとして使用することが推奨された.NET Standard 2.0 ライブラリでさえもです。3.0より古い.NET Coreバージョンでは、.NET Standard 2.0しかサポートしていないため、使用することさえできないでしょう。
調査開始! -
-
Jon Skeet が C# 8 を使った Noda-Time のアルファ版を公開した。 準備完了 は、.NET Standard 2.0 のみを対象としています。彼は明らかに、C# 8/.NET Standard 2.0が.NETファミリーのすべてのフレームワークをサポートすることを期待しているようだ。(Jonのブログ記事も参照 null可能な参照型の最初のステップ。 ).
-
マイクロソフト社員がC# 8のnullable参照型のためのVisual Studio UIについて議論している GitHubにて をサポートする予定であることが述べられています。
csproj
(旧.NET Core SDK形式csproj
). これは、C# 8が.NET Frameworkで使えるようになることを強く示唆するものである。[Visual Studio 2019 の言語バージョンのドロップダウンが無効になり、.NET が C# 7.3 と結びついた今、彼らはこの件を撤回するのではないかと思います]。 -
有名なブログ記事の直後には GitHubスレッド は、クロスプラットフォームへの対応について議論しました。その際、重要なポイントとして浮上したのが .NET Standard 2.1では、インターフェースのデフォルト実装がサポートされることを示すマーカーが含まれます。 - この機能は、CLRの変更が必要で、.NET Frameworkでは決して利用できないものです。Microsoftの.NETチームのプログラムマネージャーであるImmo Landwerth氏が語る重要な一節を紹介しよう。
コンパイラ(C#など)は、このフィールドの存在を利用して、デフォルトのインターフェイス実装を許可するかどうかを決定することが期待されています。このフィールドが存在する場合、ランタイムは&をロードし、結果のコードを実行できることが期待されています。
- これはすべて、"C# 8.0 is only supported on platforms that implement .NET Standard 2.1" は言い過ぎで、C# 8 は .NET Framework をサポートするということですが、あまりに不確かなので、私は GitHubで質問 という質問があり、HaloFourが回答しました。
IRCでは、.NET Frameworkに絶対に登場しない機能は、ランタイムの変更が必要なDIM(デフォルトのインターフェース・メソッド)だけです。他の機能は、.NET Frameworkに追加されることはないかもしれませんが、独自のコードまたはNuGetを通じてポリフィルできるクラスの形状によって駆動されます (範囲、インデックス、非同期イテレータ、非同期廃棄)。
-
ビクターダークス とコメントしています。 新しい nullable 属性 より複雑なNullableユースケースを設計するために必要なSystem.Runtime.dllは、.NET Core 3.0 および .NET Standard 2.1 に同梱されているもののみ利用可能です... [.NET Framework 4.8と互換性がありません。
-
ただし、イムモ・ランドワースは コメント という記事の下で、"私たちのAPIの大部分は、型が完全に汎用的であるか、またはnullではないので、カスタム属性を必要としませんでした"。 Null可能な参照型を試してみる
-
ベン・ホール 問題提起 Core 3.0以外でのnullable属性の利用可能性 をGitHubで公開しており、マイクロソフト社員の以下のコメントが注目される。
C# 8 は、.net core 3.0 および .net standard 2.1 のみで完全にサポートされる予定です。 プロジェクトファイルを手動で編集し、.net core 2.1でC# 8を使用する場合。 サポート対象外の領域となります。C# 8の機能の中には、たまたま C# 8 の機能は、うまく機能するものもあれば、あまりうまく機能しないもの(例:貧弱)もあります。 パフォーマンス)、C# 8 の機能の中には余分なハックをすることで動作するもの、そしていくつかの C# 8の機能は全く動作しない。説明するのが非常に複雑です。私たちは 積極的にブロックすることで、それをナビゲートできるエキスパートユーザーが する。このサポートされていないmix&matchを使用することはお勧めしません。 を大まかに説明します。
(ヤン・コータス)
あなたのように理解しようとする人 -- そしてそれを回避しようとする人 -- は は、C# 8を自由にお使いください。重要なのは、すべての言語機能が動作するわけではないことです。 を使用することができます。
(イモ・ランドヴェルト)
注意事項
C# 8と.NET Frameworkの組み合わせは、Microsoftによって公式にサポートされていません。専門家だけのものだそうです。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] Windows 8でVisual Studioを常にAdministratorとして実行するように強制することはできますか?
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み] Visual Studioで、既存のディレクトリツリーをプロジェクトに追加するにはどうすればよいですか?
-
[解決済み] エラー - IISメタベースにアクセスできません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] LINQを使用してシーケンス内の最後の要素以外を取得する方法は?