CS801~2000

C# コンパイラエラー CS1559の原因と対策を解説

CS1559はC#でコンパイル時に発生するエラーで、StartupObjectオプションに不適切なクラスを指定した場合に表示されます。

例えば、既にインポートされているobjectクラスをMainメソッドとして使用しようとすると、このエラーが発生します。

適切なエントリーポイントを設定することで解決できます。

エラー発生の背景

C#では、プログラムの実行開始点として必ずエントリーポイント(Mainメソッド)が必要です。

このエントリーポイントが正しく指定されていない場合、プログラムが正しく起動せず、コンパイルエラーが発生することがあります。

また、エントリーポイントとして指定するクラスが誤っている場合にも同様の問題が生じます。

C#におけるエントリーポイントの仕様

C#の実行開始点は、staticMainメソッドです。

以下の点を守る必要があります。

  • プログラム中にMainメソッドが1つだけ存在すること
  • Mainメソッドはstaticであり、戻り値はvoidまたはintであること
  • クラス名と名前空間が正しく指定されていること

これらの要件が満たされていないと、エントリーポイントが認識されず、コンパイラエラーが発生する可能性があります。

StartupObjectオプションの役割

Visual Studioなどの開発環境では、プロジェクトのプロパティからStartupObjectを指定できます。

StartupObjectは、エントリーポイントとなるクラス名を明示的に設定するためのオプションです。

指定するクラスは、必ずMainメソッドを含むクラスでなければなりません。

もし誤ったクラス(たとえば、名前がobjectになっている等)を指定すると、コンパイラは適切なエントリーポイントを見つけられずエラーを出力します。

CS1559エラーの原因

コンパイラエラーCS1559は、StartupObjectに指定されたクラスがMainメソッドのエントリーポイントとして使用できない場合に発生します。

主な原因は、誤ったクラスが指定されているか、Mainメソッドの実装や配置に問題があるケースです。

不適切なクラス指定による問題

StartupObjectに不適切なクラスが指定されると、コンパイラはエントリーポイントとして認識できずエラーを返します。

たとえば、システム組み込みのobjectクラスや、Mainメソッドを持たないクラスが指定された場合です。

インポート済みの ‘object’ クラスの利用ケース

C#には、すでにSystem.Objectという基本クラスが存在します。

もしプロジェクトの設定でobjectという名前のクラスがエントリーポイントとして指定された場合、これはインポート済みの組み込みクラスと競合し、正しいMainメソッドが検出されません。

その結果、コンパイラは「’object’ はインポートされているため、Mainメソッドに対して使うことはできません。」というエラーを出力します。

Mainメソッドの存在と配置の誤り

プログラム内に複数のMainメソッドが存在している場合や、エントリーポイントとして指定されたクラスに正しい形式のMainメソッドが含まれていない場合も、エラーが発生する原因となります。

これにより、コンパイラはどのMainメソッドを起動点とすべきか判断できず、エラーが生じます。

エラー解消の対策

エラーを解消するためには、正しいエントリーポイントとなるクラスを指定し、正しい形式でMainメソッドが実装されていることを確認する必要があります。

正しいエントリーポイントの設定方法

正しいエントリーポイントを指定するには、目的に合ったクラスにMainメソッドを実装することが求められます。

また、プロジェクトプロパティで指定されるStartupObjectが対象となるクラス名と一致しているか確認する必要があります。

プロジェクトプロパティの確認と修正

Visual Studioなどの統合開発環境では、プロジェクトのプロパティ画面からStartupObjectの設定を確認できます。

具体的には、以下の手順で確認・修正します。

  • プロジェクトプロパティを開く
  • 「アプリケーション」タブを選択する
  • StartupObjectに正しいクラス(Mainメソッドを持つクラス)が指定されているか確認する

もし誤ってobjectやその他の不適切なクラスが指定されている場合は、対象のクラス名に修正します。

StartupObjectオプションの適切な指定

コマンドラインからビルドする場合は、/main:<ClassName>オプションを使ってエントリーポイントを指定することができます。

また、.csprojファイル内に以下のような指定があるか確認してください。

<StartupObject>SampleApp.Program</StartupObject>

このように正しいクラス名を指定することで、コンパイラエラーCS1559を回避することができます。

コード例で確認する対処法

実際のコード例を見ると、修正前と修正後の違いが明確になります。

修正前と修正後の比較

以下に示すサンプルコードは、誤ったStartupObject設定に基づいた例と、それを修正した正しい例の比較です。

コード例による具体的な修正手順

まずは、誤った設定の場合のサンプルコードです。

この例では、objectという名前が誤って指定されているケースを想定しています。

// WrongSample.cs
using System;
// 誤って 'object' がエントリーポイントとして設定される例
public class object
{
    // Mainメソッドが存在しないためエラーになる
}
public class AnotherClass
{
    // 複数存在する Mainメソッドであっても、
    // StartupObjectに誤った 'object' が指定されているためエラーが発生する
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello from AnotherClass");
    }
}
public class Program
{
    // このクラスには Main メソッドがないため、エントリーポイントとして利用されない
}
// Main関数を明示的に指定してビルドしても、プロジェクト設定で 'object' が指定されているとエラーが出る
(コンパイラエラー CS1559: 'object' はインポートされているため、Main メソッドに対して使うことはできません。)

次に、正しいエントリーポイントを設定した修正後のサンプルコードです。

// CorrectSample.cs
using System;
// 正しいエントリーポイントとして 'Program' クラスを利用
public class Program
{
    // 正しく定義された static Main メソッド
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello from Program");
    }
}
// プロジェクトプロパティまたは .csproj ファイルで StartupObject を "Program" に設定する必要がある
/*
  <PropertyGroup>
    <StartupObject>Program</StartupObject>
  </PropertyGroup>
*/
// エントリーポイントを明確にするため、他のクラスは Main メソッドを含めないか、エントリーポイントとして利用しない
public class Helper
{
    public void ShowMessage()
    {
        Console.WriteLine("Helper class executed.");
    }
}
Hello from Program

まとめ

この記事では、C#におけるエントリーポイントの役割や、StartupObjectオプションの設定の重要性について解説しています。

CS1559エラーの原因が不適切なクラス指定やMainメソッドの配置にあることを明らかにし、正しいクラスと方法による対策を具体的なサンプルコードとともに示しました。

これにより、実際の開発環境で正しいエントリーポイントを設定する方法が理解できる内容になっています。

関連記事

Back to top button
目次へ