次の方法で共有


言語の機能とバージョンに関連する警告を解決する

この記事では、次のコンパイラの警告について説明します。

  • CS8022、CS8023、CS8024、CS8025、CS8026、CS8059、CS8107、CS8302、CS8320、CS8370、CS8400、CS8773、CS8936、CS9058: この機能は使用できません。新しい言語バージョンをご使用ください。
  • CS8058: 機能は試験段階です。
  • CS8192:指定された言語バージョンがサポートされていないか無効です
  • CS8303:指定された言語バージョンの先頭にゼロを含めることはできません
  • CS8304: コンパイラのバージョンが言語バージョンより前のバージョンです
  • CS1738: 名前付き引数は、すべての固定引数を指定した後で指定する必要があります。
  • CS8306: タプル要素名が推論されています。
  • CS8314: 型の式は、型のパターンで処理することができません
  • CS8371: 自動プロパティ上でフィールドをターゲットとする属性を使用することは、言語バージョンではサポートされていません
  • CS8401:補間された逐語的文字列での@$代わりに$@を使用するには、新しい言語バージョンをご使用ください。
  • CS8511: 型の式は、型のパターンで処理することができません。
  • CS8627: null 許容型パラメーターは、値の型または null 非許容参照型として既知である必要があります
  • CS8630: null 許容オプションが無効です。新しい言語バージョンをご使用ください
  • CS8652: 修飾子がこの項目に対して有効ではありません。
  • CS8704: 型はインターフェイス メンバーを実装しません。パブリック以外のメンバーを暗黙的に実装することはできません。
  • CS8706:このバージョンでは機能を使用できないため、型はインターフェイス メンバーを実装できません。
  • CS8904: 変性が無効です: 型パラメーターが有効である必要があります。
  • CS8912: シールドされた 'Object.ToString' を持つレコードからの継承はサポートされていません。
  • CS8919: ターゲット ランタイムでインターフェイスの静的抽象メンバーがサポートされていないため、指定されたインターフェイス メンバーを型で実装できません
  • CS8929: ターゲット ランタイムでインターフェイスの静的抽象メンバーがサポートされていないため、メソッドでは型でインターフェイス メンバーを実装できません。
  • CS8957: 型間で共通の型が見つからなかったため、言語バージョンでは条件式が無効です。
  • CS8967: 非逐語的に補間された文字列内の改行は、C# ではサポートされていません
  • CS9014: エラー: 割り当てられていない可能性があるプロパティを使用しています。プロパティを自動既定値にするためアップグレードしてください。
  • CS9015: エラー: 割り当てられていない可能性があるフィールドを使用しています。フィールドを自動既定値にするためアップグレードしてください。
  • CS9016: 警告: 割り当てられていない可能性があるプロパティを使用しています。プロパティを自動既定値にするためアップグレードしてください。
  • CS9017: 警告: 割り当てられていない可能性があるフィールドを使用しています。フィールドを自動既定値にするためアップグレードしてください。
  • CS9064: ターゲット ランタイムは ref フィールドをサポートしていません。
  • CS9103: 認識されない RefSafetyRulesAttribute バージョンを持つモジュール内の定義があります。'11' が想定されています。
  • CS9171: ターゲット ランタイムでは、インライン配列型はサポートされていません。
  • CS9194: 引数は、ref キーワードと共に渡すことができません。in パラメーターに ref 引数を渡すには、言語バージョン 12 以上にアップグレードします。
  • CS9202: 機能 "feature" は C# 12.0 では利用できません。新しい言語バージョンをご使用ください
  • CS9211: 'Experimental' 属性の diagnosticId 引数は有効な識別子であることが必要です。
  • CS9240: ターゲット ランタイムでは、by-ref のようなジェネリックはサポートされていません。
  • CS9260: Feature は C# 13.0 では使用できません。新しい言語バージョンを使用してください*

さらに、次のエラーと警告は、最近のバージョンでの構造体の初期化の変更に関連しています。

  • CS0171CS8881: 自動的に実装されたプロパティ 'name' のバッキング フィールドは、コントロールが呼び出し元に返される前に完全に割り当てられている必要があります。
  • CS0188CS8885: すべてのフィールドが割り当てられるまでは、'this' オブジェクトは使用できません
  • CS0843CS8880: 自動的に実装されたプロパティ 'name' のバッキング フィールドは、コントロールが呼び出し元に返される前に完全に割り当てられている必要があります
  • CS8305: 機能は評価のみを目的としており、今後の更新プログラムで変更または削除される可能性があります。
  • CS9204:型は評価目的でのみ使用され、今後の更新プログラムで変更または削除される可能性があります。この診断を抑制して続行します。

これらのエラーと警告の原因は、インストールされているコンパイラが、プロジェクトで選択したバージョンよりも新しいバージョンの C# をサポートしていることです。 C# コンパイラは、以前のバージョンに準拠できます。 以前のバージョンの C# に対して構文を検証できます。また、プロジェクトで古いライブラリまたはランタイムをサポートする必要がある場合に有効です。

考えられる原因は 2 つあり、これらのエラーと警告に対処する方法は 3 つあります。

ターゲット フレームワークを更新する

コンパイラでは、以下の規則に基づいて既定値が決定されます。

移行先 Version 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

選択したフレームワークが必要な言語バージョンと一致しない場合は、ターゲット フレームワークをアップグレードできます。

一致する言語バージョンを選択する

プロジェクト ファイルで古いターゲット フレームワークが選択されている可能性があります。 プロジェクト ファイルから LangVersion 要素を削除すると、コンパイラは前のセクションに示した既定値を使用します。 次の表では、現在のすべての C# 言語バージョンを示します。 特定の言語バージョンを指定して、新しい機能を有効にすることもできます。

説明
preview コンパイラは、最新のプレビュー バージョンの有効な言語構文をすべて受け入れます。
latest コンパイラは、最新リリース バージョンのコンパイラ (マイナー バージョンを含む) の構文を受け入れます。
latestMajor
または default
コンパイラは、最新リリースのメジャー バージョンのコンパイラの構文を受け入れます。
13.0 コンパイラが受け入れるのは C# 13 以下に含まれている構文だけです。
12.0 コンパイラは、C# 12 以下に含まれている構文のみを受け入れます。
11.0 コンパイラは、C# 11 以下に含まれている構文のみを受け入れます。
10.0 コンパイラは、C# 10 以下に含まれている構文のみを受け入れます。
9.0 コンパイラは、C# 9 以下に含まれている構文のみを受け入れます。
8.0 コンパイラは、C# 8.0 以下に含まれている構文のみを受け入れます。
7.3 コンパイラは、C# 7.3 以下に含まれている構文のみを受け入れます。
7.2 コンパイラは、C# 7.2 以下に含まれている構文のみを受け入れます。
7.1 コンパイラは、C# 7.1 以下に含まれている構文のみを受け入れます。
7 コンパイラは、C# 7.0 以下に含まれている構文のみを受け入れます。
6 コンパイラは、C# 6.0 以下に含まれている構文のみを受け入れます。
5 コンパイラは、C# 5.0 以下に含まれている構文のみを受け入れます。
4 コンパイラは、C# 4.0 以下に含まれている構文のみを受け入れます。
3 コンパイラは、C# 3.0 以下に含まれている構文のみを受け入れます。
ISO-2
または 2
コンパイラは、ISO/IEC 23270:2006 C# (2.0) に含まれている構文のみを受け入れます。
ISO-1
または 1
コンパイラは、ISO/IEC 23270:2003 C# (1.0/1.2) に含まれている構文のみを受け入れます。

各フレームワーク バージョンでサポートされている言語バージョンの詳細については、言語リファレンス セクションの「言語バージョンの構成」に関する記事を参照してください。

更新された機能を回避する

古いライブラリまたはランタイムをサポートする必要がある場合は、新しい機能の使用を避ける必要がある場合があります。

試験的な機能を有効にする

実験機能の診断を無効にして、試験的機能を使用できます。

警告

試験的な機能は変更される可能性があります。 API が変更されたり、将来の更新プログラムで削除されたりする可能性があります。 試験的機能を含めることは、将来の発展のためのアイディアやコンセプトに関するフィードバックをライブラリの作成者が得る方法になります。 試験段階としてマークされた機能を使用する場合は、細心の注意を払ってください。

また、System.Diagnostics.CodeAnalysis.ExperimentalAttribute を使用して独自の試験的な機能を宣言することもできます。 試験的な機能に使用される識別子が有効な識別子でない場合、コンパイラは CS9211 を出力します

構造体の初期化に関する破壊的変更

これらのエラーと警告はすべて、フィールドにアクセスする前に struct 型が正しく初期化されていることを確認するのに役立ちます。 以前のバージョンの C# では、任意のコンストラクター内の構造体内のすべてのフィールドを明示的に割り当てる必要があります。 パラメーターなしのコンストラクターは、すべてのフィールドをその既定値に初期化します。 以降のバージョンでは、すべてのコンストラクターによってすべてのフィールドが初期化されます。 フィールドが明示的に設定されているか、フィールド初期化子に設定されているか、既定値に設定されています。

  • CS0171CS8881: 自動的に実装されたプロパティ 'name' のバッキング フィールドは、コントロールが呼び出し元に返される前に完全に割り当てられている必要があります。
  • CS0188CS8885: すべてのフィールドが割り当てられるまでは、'this' オブジェクトは使用できません
  • CS0843CS8880: 自動的に実装されたプロパティ 'name' のバッキング フィールドは、コントロールが呼び出し元に返される前に完全に割り当てられている必要があります

このエラーに対処するには、言語バージョンを C# 11 にアップグレードし、すべての struct コンストラクターですべてのフィールドが初期化されるようにします。 この操作が不可能な場合は、次の例に示すように、既定のコンストラクターを明示的に呼び出す必要があります。

struct S
{
    public int AIProp { get; set; }
    public S(int i){} //CS0843
    // Try the following lines instead.
    // public S(int i) : this()
    // {
    //     AIProp = i;
    // }
}

class Test
{
    static int Main()
    {
        return 1;
    }
}