2009-08-12 6 views
3

Le programme "" a plus d'un point d'entrée défini: 'Class.Main()'. Compilez avec/main pour spécifier le type qui contient le point d'entrée.Le compilateur C# ne reconnaît pas surchargé Main

J'ai recherché et recherché, et j'ai seulement trouvé la syntaxe pour spécifier la classe du point d'entrée, (/ main: class) mais pas le type. Quelqu'un peut-il aider?

static void Main() 
{ 
} 

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

Pourquoi avez-vous besoin de deux méthodes principales? Il suffit de supprimer celui sans paramètres. – Grzenio

+0

Grzenio: ou l'autre, ils sont tous les deux autorisés. C'est le problème sous-jacent. –

+0

Et puis considérez les surcharges qui retournent int au lieu de void :) –

Répondre

7

Vous ne pouvez pas faire cela, fondamentalement.

Vous ne pouvez spécifier qu'un type est un point d'entrée, et non pas qui surcharge principal dans un type devrait être le point d'entrée.

Vous pouvez créer une classe imbriquée contenant un d'entre eux, si vous voulez garder le code dans le même type externe:

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

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

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

Vous devez ensuite utiliser soit /main:Test ou /main:Test.Parameterless selon lequel vous voulez appeler ou utiliser le point d'entrée d'application dans les propriétés du projet dans Visual Studio.

4

Je ne crois pas qu'il est possible de surcharger principale, pour cette raison exacte: il ne peut y avoir qu'un seul point d'entrée dans votre programme! Ce que le "/ main" vous permet de faire est de spécifier le type (ie la classe ou la structure) qui contient le point d'entrée principal, et non la signature (ie de la surcharge) donc le compilateur est laissé avec l'ambiguïté .

+1

Il surcharge, pas de surcharge. Et un type n'est pas la même chose qu'un assemblage. –

+0

Je suis corrigé .. –

3

Les règles de Main() autorisent les deux formes de Main que vous listez, mais une seule doit être présente à tout moment dans la classe. Si elles sont dans des classes différentes, vous pouvez l'utiliser pour résoudre le problème. Ce que vous voyez est le seul cas qui n'est pas couvert par les règles de surcharge.

1

En dernier recours, vous pouvez essayer

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

    } 
    else 
    { 

    } 
} 

peut-être pas la meilleure méthode, mais il fonctionnerait. C'est contre les concepts d'une application d'avoir 2 points d'entrée.

+3

args ne sera jamais nul, ce sera juste une chaîne vide []. if (args.Length == 0) – ahawker

+0

(À moins qu'il ne soit appelé directement à partir d'un autre code, bien sûr.) –

+0

+1, parce que vous obtenez le point après tout .. – nawfal

Questions connexes