Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article traite des erreurs et des avertissements suivants du compilateur :
- CS0017 : Le programme « nom du fichier de sortie » a plusieurs points d’entrée définis. Compilez avec /main pour spécifier le type qui contient le point d’entrée.
- CS0028 : 'déclaration de fonction' a la signature incorrecte pour être un point d’entrée
- CS0402 : 'identificateur' : un point d’entrée ne peut pas être générique ou dans un type générique
- CS1555 : Impossible de trouver 'class' spécifié pour la méthode Main
- CS1556 : 'construct' spécifié pour la méthode Main doit être une classe ou un struct valide
- CS1557 : Impossible d’utiliser 'class' pour la méthode Main, car il se trouve dans un autre fichier de sortie
- CS1558 : 'class' n’a pas de méthode main statique appropriée
- CS1559 : Impossible d’utiliser 'object' pour la méthode Main, car elle est importée
- CS2017 : Impossible de spécifier /main si vous créez un module ou une bibliothèque
- CS5001 : Le programme ne contient pas de méthode statique « Main » adaptée à un point d’entrée
- CS7022 : Le point d’entrée du programme est du code global ; en ignorant le point d’entrée «{0} ».
- CS8801 : Impossible d’utiliser la variable locale ou la fonction locale '{0}' déclarée dans une instruction de niveau supérieur dans ce contexte.
- CS8802 : une seule unité de compilation peut avoir des instructions de niveau supérieur.
- CS8803 : Les instructions de niveau supérieur doivent précéder les déclarations d’espace de noms et de type.
- CS8805 : Le programme utilisant des instructions de niveau supérieur doit être un exécutable.
- CS8899 : Les points d’entrée d’application ne peuvent pas être attribués avec « UnmanagedCallersOnly ».
- CS8937 : Au moins une instruction de niveau supérieur doit être non vide.
Main déclaration de méthode
- CS0017 : Le programme « nom du fichier de sortie » a plusieurs points d’entrée définis. Compilez avec /main pour spécifier le type qui contient le point d’entrée.
- CS0028 : 'déclaration de fonction' a la signature incorrecte pour être un point d’entrée
- CS0402 : 'identificateur' : un point d’entrée ne peut pas être générique ou dans un type générique
- CS1558 : 'class' n’a pas de méthode main statique appropriée
- CS5001 : Le programme ne contient pas de méthode statique « Main » adaptée à un point d’entrée
- CS8899 : Les points d’entrée d’application ne peuvent pas être attribués avec « UnmanagedCallersOnly ».
Un programme qui se compile sur un exécutable doit contenir une méthode valide Main comme point d’entrée. Pour plus d’informations, consultez Les arguments main() et de ligne de commande.
Pour corriger ces erreurs, vérifiez que votre Main déclaration de méthode suit les règles suivantes :
- Déclarez la méthode
Mainen tant questaticavec un type de retourvoid,int,TaskouTask<int>, car le runtime exige une signature spécifique pour identifier le point d’entrée du programme (CS0028, CS1558). La méthode peut éventuellement accepter unstring[]paramètre pour les arguments de ligne de commande. Si vous utilisez leasyncmodificateur, le type de retour doit êtreTaskouTask<int>, et vous devez cibler la version 7.1 ou ultérieure du langage C# . - Déplacez la
Mainméthode hors de tout type générique, car le runtime ne peut pas résoudre un point d’entrée unique lorsque le type conteneur requiert des arguments de type (CS0402). - Supprimez l’attribut UnmanagedCallersOnlyAttribute de la méthode
Main, car les points d’entrée doivent pouvoir être appelés à partir du code managé etUnmanagedCallersOnlyrestreint la méthode aux appels uniquement non managés (CS8899). - Lorsque votre code contient plusieurs
Mainméthodes entre différents types, utilisez l’option du compilateur StartupObject pour spécifier le type qui contient le point d’entrée prévu (CS0017). Sans cette option, le compilateur ne peut pas déterminer laMainméthode à utiliser. - Vérifiez que votre projet exécutable définit une
Mainméthode avec une signature correcte, car un projet avec un OutputTyped’exe ou winexe nécessite un point d’entrée (CS5001, CS1558). Le nom de la méthode est sensible à la casse -mainn'est pas éligible. Si vous n’avez pas besoin d’un exécutable, remplacez le type de sortie par bibliothèque.
Note
CS0028 est un diagnostic hérité que le compilateur C# actuel ne produit pas. Les versions modernes du compilateur signalent CS1558 ou CS5001 au lieu de cela quand la méthode Main a une signature non valide.
Note
CS0017, CS0028, CS0402, CS1558 et CS5001 sont signalés uniquement pendant les opérations de génération ou de reconstruction . Ils n’apparaissent pas en tant que diagnostics IntelliSense pendant que vous tapez dans l’IDE.
Option de compilateur StartupObject
- CS1555 : Impossible de trouver 'class' spécifié pour la méthode Main
- CS1556 : 'construct' spécifié pour la méthode Main doit être une classe ou un struct valide
- CS1557 : Impossible d’utiliser 'class' pour la méthode Main, car il se trouve dans un autre fichier de sortie
- CS1559 : Impossible d’utiliser 'object' pour la méthode Main, car elle est importée
- CS2017 : Impossible de spécifier /main si vous créez un module ou une bibliothèque
L’option du compilateur StartupObject (également appelée /main) spécifie le type qui contient la méthode du Main programme lorsque plusieurs types en définissent un. Pour plus d’informations, consultez StartupObject et Main() et arguments de ligne de commande.
Pour corriger ces erreurs, vérifiez que l’option StartupObject fait référence à un type valide :
- Vérifiez que le nom de classe entièrement qualifié que vous passez à
StartupObjectcorrespond exactement à un type défini dans le code source de la compilation actuelle. Le compilateur recherche uniquement les fichiers sources compilés ( pas les assemblys référencés) pour le type spécifié (CS1555). Vérifiez les erreurs typographiques dans le nom pleinement qualifié, y compris l'espace de noms. - Vérifiez que l’identificateur que vous passez fait référence à un
classoustructnon générique. Le compilateur nécessite un type concret qui peut contenir une méthode valideMain(CS1556). Les interfaces, les énumérations, les délégués et les types génériques ne sont pas des cibles valides. - Déplacez la classe spécifiée dans le même fichier de sortie que la compilation actuelle. L’option
/mainrésout le point d’entrée dans un assembly de sortie unique et ne peut pas référencer les types compilés dans une autre sortie (CS1557). - Vérifiez que le type spécifié est défini dans le code source du projet actuel plutôt que dans un assembly référencé. Le compilateur ne peut pas désigner un type importé comme point d’entrée (CS1559).
- Supprimez l’option lors de la création d’une
/mainbibliothèque ou d’un module. Seuls les projets exécutables (avec un OutputTyped’exe ou winexe) ont des points d’entrée (CS2017). Si vous avez besoin d’un point d’entrée, remplacez le type de sortie par un exécutable. - Vérifiez que le type spécifié par
StartupObjectdéclare une méthode valideMain. Si le type existe mais ne contient pas de méthode statiqueMainappropriée, le compilateur génère l’erreur CS1558. Consultez laMainsection déclaration de méthode pour la signature requise.
Note
CS1557 et CS1559 sont des diagnostics hérités que le compilateur C# actuel ne produit pas. Les scénarios qui ont déclenché ces erreurs ne sont plus pris en charge ou se produisent trop rarement pour justifier la détection.
Note
CS1555 et CS1556 sont signalés uniquement pendant les opérations de génération ou de reconstruction . Ils n’apparaissent pas en tant que diagnostics IntelliSense pendant que vous tapez dans l’IDE.
Déclarations de niveau supérieur
- CS7022 : Le point d’entrée du programme est du code global ; en ignorant le point d’entrée «{0} ».
- CS8801 : Impossible d’utiliser la variable locale ou la fonction locale '{0}' déclarée dans une instruction de niveau supérieur dans ce contexte.
- CS8802 : une seule unité de compilation peut avoir des instructions de niveau supérieur.
- CS8803 : Les instructions de niveau supérieur doivent précéder les déclarations d’espace de noms et de type.
- CS8805 : Le programme utilisant des instructions de niveau supérieur doit être un exécutable.
- CS8937 : Au moins une instruction de niveau supérieur doit être non vide.
Les instructions de niveau supérieur remplacent la méthode explicite Main comme point d’entrée du programme. Pour plus d’informations, consultez les instructions de niveau supérieur dans le guide de programmation C# et la spécification des fonctionnalités d’instructions de niveau supérieur .
Pour corriger ces erreurs, vérifiez que votre utilisation d’instructions de niveau supérieur suit les règles suivantes :
- Regroupez toutes les instructions de niveau supérieur dans un seul fichier, car une seule unité de compilation (fichier) peut contenir des instructions de niveau supérieur (CS8802). Déplacez tout code de niveau supérieur d’autres fichiers dans ce fichier unique. Restructurez les fichiers restants afin qu’ils contiennent uniquement des déclarations d’espace de noms et de type.
- Veuillez placer toutes les instructions de niveau supérieur avant toute déclaration
namespaceoutypedans le fichier, car le compilateur exige leur présence en premier (CS8803). Si vous avezusingdirectives, ces directives peuvent toujours précéder les instructions de niveau supérieur. - Incluez au moins une instruction qui contient du code exécutable, car un fichier avec uniquement des instructions vides, des espaces blancs ou des commentaires ne se qualifie pas comme un point d’entrée valide (CS8937). Ajoutez une instruction telle qu’un appel de méthode, une attribution de variable ou une expression pour répondre à l’exigence.
- Accédez aux variables locales et aux fonctions locales déclarées dans les instructions de niveau supérieur uniquement à partir du contexte d’instruction de niveau supérieur lui-même, car ces déclarations sont étendues à la méthode de point d’entrée générée et ne sont pas visibles par d’autres fichiers ou pour taper des membres déclarés dans le même fichier (CS8801). Si vous devez partager l’état entre les fichiers, déclarez la variable en tant que champ ou propriété statique sur un type à la place.
- Définissez le OutputType du projet sur exe, car les instructions de niveau supérieur définissent un point d’entrée et des points d’entrée sont valides uniquement dans les projets exécutables (CS8805). Si vous créez une bibliothèque, supprimez les instructions de niveau supérieur et utilisez plutôt des types et des méthodes.
- Supprimez ou renommez une méthode explicite
Mainlorsque des instructions de niveau supérieur sont présentes, car le compilateur traite les instructions de niveau supérieur comme point d’entrée et ignore touteMainméthode, produisant un avertissement (CS7022). Si vous envisagez d’utiliser une méthode expliciteMain, déplacez le code d’instruction de niveau supérieur dans cette méthode et supprimez les instructions de niveau supérieur.