プログラムのエントリ ポイントに関連するエラーと警告を解決する

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

  • CS0017: プログラム '出力ファイル名' には、複数のエントリ ポイントが定義されています。/main を使用してコンパイルし、エントリ ポイントを含む型を指定します。
  • CS0028: 'function declaration' にエントリ ポイントになるシグネチャが間違っています
  • CS0402: 'identifier': エントリ ポイントをジェネリックまたはジェネリック型にすることはできません
  • CS1555: Main メソッドに指定された 'class' が見つかりませんでした
  • CS1556: Main メソッドに指定された 'construct' は、有効なクラスまたは構造体である必要があります
  • CS1557: Main メソッドが別の出力ファイル内にあるため、'class' を使用できません
  • CS1558: 'class' に適切な静的 Main メソッドがありません
  • CS1559: Main メソッドがインポートされているため、'object' を使用できません
  • CS2017: モジュールまたはライブラリをビルドする場合、/main を指定できません
  • CS5001: プログラムにエントリ ポイントに適した静的な 'Main' メソッドが含まれていません
  • CS7022: プログラムのエントリ ポイントはグローバル コードであり、'{0}' エントリ ポイントは無視されます。
  • CS8801: このコンテキストの最上位ステートメントで宣言されたローカル変数またはローカル関数 '{0}' を使用できません。
  • CS8802: 最上位レベルのステートメントを含めることができるコンパイル ユニットは 1 つだけです。
  • CS8803: 最上位レベルのステートメントは、名前空間と型宣言の前に置く必要があります。
  • CS8805: 最上位レベルのステートメントを使用するプログラムは実行可能ファイルである必要があります。
  • CS8899: アプリケーション エントリ ポイントを 'UnmanagedCallersOnly' に属性付けすることはできません。
  • CS8937: 少なくとも 1 つの最上位レベルのステートメントが空でない必要があります。

Main メソッド宣言

  • CS0017: プログラム '出力ファイル名' には、複数のエントリ ポイントが定義されています。/main を使用してコンパイルし、エントリ ポイントを含む型を指定します。
  • CS0028: 'function declaration' にエントリ ポイントになるシグネチャが間違っています
  • CS0402: 'identifier': エントリ ポイントをジェネリックまたはジェネリック型にすることはできません
  • CS1558: 'class' に適切な静的 Main メソッドがありません
  • CS5001: プログラムにエントリ ポイントに適した静的な 'Main' メソッドが含まれていません
  • CS8899: アプリケーション エントリ ポイントを 'UnmanagedCallersOnly' に属性付けすることはできません。

実行可能ファイルにコンパイルするプログラムには、エントリ ポイントとして有効な Main メソッドが含まれている必要があります。 詳細については、 Main() およびコマンド ライン引数を参照してください。

これらのエラーを修正するには、 Main メソッドの宣言が次の規則に従っていることを確認します。

  • ランタイムはプログラムのエントリ ポイント (Main、static) を識別するために特定のシグネチャを必要とするため、void メソッドをint、Task、Task<int>、またはの戻り値の型でとして宣言します。 このメソッドは、必要に応じて、コマンド ライン引数の string[] パラメーターを受け取ることができます。 async修飾子を使用する場合、戻り値の型はTaskまたはTask<int>する必要があり、C# 言語バージョン 7.1 以降を対象とする必要があります。
  • Mainメソッドを任意のジェネリック型から移動します。これは、含まれる型に型引数が必要な場合にランタイムが一意のエントリ ポイントを解決できないためです (CS0402)。
  • エントリ ポイントはマネージド コードから呼び出せる必要があり、UnmanagedCallersOnlyAttributeはメソッドをアンマネージド呼び出し元のみに制限するため、Main属性をUnmanagedCallersOnly メソッドから削除します (CS8899)。
  • コードに異なる型の複数の Main メソッドが含まれている場合は、 StartupObject コンパイラ オプションを使用して、目的のエントリ ポイント (CS0017) を含む型を指定します。 このオプションがないと、コンパイラは使用する Main メソッドを決定できません。
  • exe Mainwinexe の OutputType を持つプロジェクトにはエントリ ポイント (CS5001、CS1558) が必要であるため、実行可能プロジェクトで正しいシグネチャを持つ メソッドが定義されていることを確認します。 メソッド名は大文字と小文字が区別されます。したがって、main は条件を満たしません。 実行可能ファイルが必要ない場合は、出力の種類をライブラリに変更 します。

注

CS0028 は、現在の C# コンパイラでは生成されないレガシ診断です。 コンパイラの最新バージョンでは、 メソッドに無効なシグネチャがある場合に代わりに CS1558 または Main が報告されます。

注

CS0017、CS0028、CS0402、CS1558、および CS5001 は、 ビルド または リビルド 操作中にのみ報告されます。 IDE で入力しても、IntelliSense 診断として表示されません。

StartupObject コンパイラ オプション

  • CS1555: Main メソッドに指定された 'class' が見つかりませんでした
  • CS1556: Main メソッドに指定された 'construct' は、有効なクラスまたは構造体である必要があります
  • CS1557: Main メソッドが別の出力ファイル内にあるため、'class' を使用できません
  • CS1559: Main メソッドがインポートされているため、'object' を使用できません
  • CS2017: モジュールまたはライブラリをビルドする場合、/main を指定できません

StartupObject コンパイラ オプション (/main とも呼ばれます) は、複数の型で 1 つを定義する場合に、プログラムのMain メソッドを含む型を指定します。 詳細については、 StartupObject と Main() およびコマンド ライン引数を参照してください。

これらのエラーを修正するには、 StartupObject オプションが有効な型を参照していることを確認します。

  • StartupObjectに渡す完全修飾クラス名が、現在のコンパイルのソース コードで定義されている型と一致することを確認します。 コンパイラは、指定された型 (CS1555) について、コンパイル中のソース ファイル (参照アセンブリではなく) のみを検索します。 名前空間を含め、完全修飾名に入力ミスがないか確認します。
  • StartupObjectに渡す識別子が、非ジェネリック classまたはstructを参照していることを確認します。 コンパイラには、有効な Main メソッド (CS1556) を含めることができる具象型が必要です。 インターフェイス、列挙型、デリゲート、ジェネリック型は有効なターゲットではありません。
  • 指定したクラスを、現在のコンパイルと同じ出力ファイルに移動します。 /main オプションは、1 つの出力アセンブリ内のエントリ ポイントを解決し、別の出力にコンパイルされた型を参照することはできません (CS1557)。
  • 指定した型が、参照されるアセンブリではなく、現在のプロジェクトのソース コードで定義されていることを確認します。 コンパイラは、インポートされた型をエントリ ポイント (CS1559) として指定できません。
  • ライブラリまたはモジュールをビルドするときに、 /main オプションを削除します。 エントリ ポイント (CS2017) を持つのは、実行可能プロジェクト (exe または winexe の OutputType を含む) だけです。 エントリ ポイントが必要な場合は、出力の種類を実行可能ファイルに変更します。
  • StartupObjectで指定された型で有効なMain メソッドが宣言されていることを確認します。 型が存在するが、適切な静的 Main メソッドが含まれていない場合、コンパイラは CS1558 を生成します。 必要なシグネチャについては、「 Main メソッド宣言 」セクションを参照してください。

注

CS1557 と CS1559 は、現在の C# コンパイラでは生成されないレガシ診断です。 これらのエラーを引き起こしたシナリオは、サポートされなくなったり、検出を保証する頻度が低すぎたりします。

注

CS1555 および CS1556 は、 ビルド または リビルド 操作中にのみ報告されます。 IDE で入力しても、IntelliSense 診断として表示されません。

トップレベルステートメント

  • CS7022: プログラムのエントリ ポイントはグローバル コードであり、'{0}' エントリ ポイントは無視されます。
  • CS8801: このコンテキストの最上位ステートメントで宣言されたローカル変数またはローカル関数 '{0}' を使用できません。
  • CS8802: 最上位レベルのステートメントを含めることができるコンパイル ユニットは 1 つだけです。
  • CS8803: 最上位レベルのステートメントは、名前空間と型宣言の前に置く必要があります。
  • CS8805: 最上位レベルのステートメントを使用するプログラムは実行可能ファイルである必要があります。
  • CS8937: 少なくとも 1 つの最上位レベルのステートメントが空でない必要があります。

最上位レベルのステートメントは 、明示的な Main メソッドをプログラムのエントリ ポイントとして置き換えます。 詳細については、C# プログラミング ガイドの 最上位レベルのステートメント と、C# 言語仕様の 最上位レベルのステートメント のセクションを参照してください。

これらのエラーを修正するには、最上位レベルのステートメントを次の規則に従って使用してください。

  • 最上位レベルのステートメント (CS8802) を含めることができるコンパイル 単位 (ファイル) は 1 つだけであるため、最上位レベルのステートメントをすべて 1 つのファイルに統合します。 最上位レベルのコードを他のファイルからその 1 つのファイルに移動します。 残りのファイルを再構築して、名前空間と型の宣言のみを含めます。
  • ファイル内の namespace または type 宣言の前にすべての最上位レベルのステートメントを配置します。これは、コンパイラが最上位レベルのステートメントを最初に表示する必要があるためです (CS8803)。 usingディレクティブがある場合でも、これらのディレクティブは最上位レベルのステートメントの前に置くことができます。
  • 空のステートメント、空白、またはコメントのみを含むファイルは有効なエントリ ポイントとして修飾されないため、実行可能コードを含むステートメントを少なくとも 1 つ含めます (CS8937)。 要件を満たすために、メソッド呼び出し、変数の代入、式などのステートメントを追加します。
  • 最上位ステートメントで宣言されたローカル変数とローカル関数には、最上位のステートメント コンテキスト自体からのみアクセスします。これらの宣言は、生成されたエントリ ポイント メソッドのスコープであり、他のファイルや同じファイルで宣言された型メンバーには表示されないためです (CS8801)。 ファイル間で状態を共有する必要がある場合は、代わりに変数を静的フィールドまたは型のプロパティとして宣言します。
  • 最上位レベルのステートメントでエントリ ポイントが定義され、エントリ ポイントは実行可能プロジェクト (CS8805) でのみ有効であるため、プロジェクトの OutputType を exe に設定します。 ライブラリを構築する場合は、最上位レベルのステートメントを削除し、代わりに型とメソッドを使用します。
  • 最上位レベルのステートメントが存在する場合、明示的な Main メソッドを削除または名前変更します。これは、コンパイラが最上位レベルのステートメントをエントリ ポイントとして扱い、 Main メソッドを無視して警告を生成するためです (CS7022)。 明示的な Main メソッドを使用する場合は、最上位レベルのステートメント コードをそのメソッドに移動し、最上位のステートメントを削除します。