2009-08-12 11 views
3

プログラムに "Class.Main()"という複数のエントリポイントが定義されています。エントリポイントを含む型を指定するには、/ mainを使用してコンパイルします。C#コンパイラがオーバーロードされていないことを認識しない

エントリポイントのクラス(/ main:class)を指定する構文が見つかりましたが、タイプは検索されませんでした。誰も助けることができますか?

static void Main() 
{ 
} 

static void Main(string[] args) 
{ 
} 
+0

なぜ2つのメインメソッドが必要ですか?パラメータなしで削除するだけです。 – Grzenio

+0

グレッツィニオ:またはもう一方は、どちらも許可されています。それが根底にある問題です。 –

+0

そして、voidの代わりにintを返すオーバーロードを考えてみましょう:) –

答えて

7

これは基本的にはできません。

あなただけタイプがエントリポイントであるべき形内の主な過負荷エントリポイント、ではないことを指定することができます。

あなたは同じ外型の内のコードを維持したい場合は、それらの1つを含むネストされたクラスを作成することができます。

using System; 
using System.IO; 
using System.Text.RegularExpressions; 

class Test 
{ 
    class Parameterless 
    { 
     static void Main() 
     { 
     } 
    } 

    static void Main(string[] args){} 
} 

あなたは、あなたが望むどちらに応じて、/main:Testまたは/main:Test.Parameterlessのいずれかを使用する必要があります呼び出し、またはVisual Studioのプロジェクトプロパティでアプリケーションエントリポイントを使用します。

4

私はそれがmainにオーバーロードされる可能性が高いと思います。なぜなら、あなたのプログラムには1つのエントリポイントしか存在しない可能性があります。

"/ main"でできることは、コンパイラがあいまいなままになるように、署名(すなわち、過負荷のどれか)ではなく、メインエントリポイントを含む型(すなわちクラスまたは構造体)を指定することです。

+1

オーバーライドではなく、オーバーロードしています。タイプはアセンブリと同じではありません。 –

+0

私は訂正されました。 –

3

Main()のルールは、あなたがリストするMainの両方の形式を許可しますが、クラス内に1つだけ存在する必要があります。それらが異なるクラスにある場合は、それを使用して問題を解決できます。あなたが見ているのは、オーバーロードルールでカバーされていない1つのケースです。

1

最後の手段として、あなたは

 
static void Main(string[] args) 
{ 
    if (args == null) 
    { 

    } 
    else 
    { 

    } 
} 

が最善の方法ではない可能性があります試みることができるが、それが働くだろう。 2つのエントリーポイントを持つのは、アプリケーションの概念に反します。

+3

argsは決してnullにはならず、空の文字列[]になります。 if(args.Length == 0) – ahawker

+0

(もちろん他のコードから直接呼び出されていない限り) –

+0

+1、結局のところポイントを得るからです。 – nawfal

関連する問題