1. ホーム
  2. c#

[解決済み】C# 8は.NET Frameworkをサポートしていますか?

2022-04-10 20:58:22

質問

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以降で行う方法は以下をお読みください。

どのフレームワークを対象にしても、ほとんどの機能(すべてではありませんが)が利用できます。


動作する機能

以下の機能は、構文の変更のみで、フレームワークに関係なく動作します。

動作させることができる機能

これらは、.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 で、プロジェクトを保存しました。もちろんこの時点ではビルドされません。プロジェクトファイルをテキストエディタで開き latestpreview ビルド構成で 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を通じてポリフィルできるクラスの形状によって駆動されます (範囲、インデックス、非同期イテレータ、非同期廃棄)。

<ブロッククオート

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によって公式にサポートされていません。専門家だけのものだそうです。