Condividi tramite


Risolvere gli errori e gli avvisi correlati a un punto di ingresso del programma

Questo articolo illustra gli errori e gli avvisi del compilatore seguenti:

  • CS0017: il programma 'nome file di output' ha più di un punto di ingresso definito. Compilare con /main per specificare il tipo che contiene il punto di ingresso.
  • CS0028: 'dichiarazione della funzione' ha la firma non corretta come punto di ingresso
  • CS0402: 'identifier': un punto di ingresso non può essere generico o in un tipo generico
  • CS1555: Impossibile trovare 'class' specificata per il metodo Main
  • CS1556: 'construct' specificato per il metodo Main deve essere una classe o uno struct valido
  • CS1557: Impossibile usare 'class' per il metodo Main perché si trova in un file di output diverso
  • CS1558: 'class' non dispone di un metodo Main statico appropriato
  • CS1559: Impossibile usare 'object' per il metodo Main perché viene importato
  • CS2017: Impossibile specificare /main se si compila un modulo o una libreria
  • CS5001: Il programma non contiene un metodo statico 'Main' adatto per un punto di ingresso
  • CS7022: il punto di ingresso del programma è codice globale, ignorando il punto di ingresso '{0}'.
  • CS8801: impossibile usare la variabile locale o la funzione locale '{0}' dichiarata in un'istruzione di primo livello in questo contesto.
  • CS8802: solo un'unità di compilazione può avere istruzioni di primo livello.
  • CS8803: le istruzioni di primo livello devono precedere le dichiarazioni dello spazio dei nomi e dei tipi.
  • CS8805: il programma che usa istruzioni di primo livello deve essere un eseguibile.
  • CS8899: i punti di ingresso dell'applicazione non possono essere attribuiti con 'UnmanagedCallersOnly'.
  • CS8937: Almeno un'istruzione di primo livello non deve essere vuota.

Main dichiarazione del metodo

  • CS0017: il programma 'nome file di output' ha più di un punto di ingresso definito. Compilare con /main per specificare il tipo che contiene il punto di ingresso.
  • CS0028: 'dichiarazione di funzione' ha una firma non appropriata per essere un punto di ingresso
  • CS0402: 'identifier': un punto di ingresso non può essere generico o in un tipo generico
  • CS1558: 'class' non dispone di un metodo Main statico appropriato
  • CS5001: Il programma non contiene un metodo statico 'Main' adatto per un punto di ingresso
  • CS8899: i punti di ingresso dell'applicazione non possono essere attribuiti con 'UnmanagedCallersOnly'.

Un programma compilato in un eseguibile deve contenere un metodo valido Main come punto di ingresso. Per altre informazioni, vedere Argomenti della riga di comando e Main().

Per correggere questi errori, verificare che la Main dichiarazione del metodo segua queste regole:

  • Dichiarare il Main metodo come static con un tipo restituito di void, int, Tasko Task<int>, perché il runtime richiede una firma specifica per identificare il punto di ingresso del programma (CS0028, CS1558). Facoltativamente, il metodo può accettare un string[] parametro per gli argomenti della riga di comando. Se si utilizza il async modificatore, il tipo restituito deve essere Task o Task<int>, e bisogna usare la linguaggio C# versione 7.1 o superiore.
  • Spostare il Main metodo da qualsiasi tipo generico, perché il runtime non è in grado di risolvere un punto di ingresso univoco quando il tipo contenitore richiede argomenti di tipo (CS0402).
  • Rimuovere l'attributo dal UnmanagedCallersOnlyAttribute metodo , perché i Main punti di ingresso devono essere chiamabili dal codice gestito e UnmanagedCallersOnly limitano il metodo solo ai chiamanti non gestiti (CS8899).
  • Quando il codice contiene più Main metodi tra diversi tipi, usare l'opzione del compilatore StartupObject per specificare il tipo che contiene il punto di ingresso previsto (CS0017). Senza questa opzione, il compilatore non è in grado di determinare quale Main metodo usare.
  • Verificare che il progetto eseguibile definisca un Main metodo con una firma corretta, perché un progetto con outputTypeexe o winexe richiede un punto di ingresso (CS5001, CS1558). Il nome del metodo distingue tra maiuscole e minuscole - main non soddisfa i criteri. Se non è necessario un eseguibile, modificare il tipo di output in libreria.

Annotazioni

CS0028 è una diagnostica legacy che il compilatore C# corrente non produce. Nelle versioni moderne, il compilatore segnala CS1558 o CS5001 invece, quando il metodo Main ha una firma non valida.

Annotazioni

CS0017, CS0028, CS0402, CS1558 e CS5001 vengono segnalati solo durante le operazioni di compilazione o ricompilazione . Non vengono visualizzati come diagnostica di IntelliSense durante la digitazione nell'IDE.

StartupObject (opzione del compilatore)

  • CS1555: Impossibile trovare 'class' specificata per il metodo Main
  • CS1556: 'construct' specificato per il metodo Main deve essere una classe o uno struct valido
  • CS1557: Impossibile usare 'class' per il metodo Main perché si trova in un file di output diverso
  • CS1559: Impossibile usare 'object' per il metodo Main perché viene importato
  • CS2017: Impossibile specificare /main se si compila un modulo o una libreria

L'opzione del compilatore StartupObject (nota anche come /main) specifica il tipo che contiene il metodo del Main programma quando più tipi ne definiscono uno. Per altre informazioni, vedere StartupObject e Main() e argomenti della riga di comando.

Per correggere questi errori, verificare che l'opzione StartupObject faccia riferimento a un tipo valido:

  • Verificare che il nome completo della classe passato a StartupObject corrisponda a un tipo definito nel codice sorgente della compilazione corrente. Il compilatore cerca solo i file di origine da compilare, non gli assembly a cui si fa riferimento, per il tipo specificato (CS1555). Verificare la presenza di errori di digitazione nel nome completo, incluso lo spazio dei nomi.
  • Verificare che l'identificatore passato a StartupObject faccia riferimento a un oggetto non generico class o struct. Il compilatore richiede un tipo concreto che può contenere un metodo valido Main (CS1556). Interfacce, enumerazioni, delegati e tipi generici non sono destinazioni valide.
  • Spostare la classe specificata nello stesso file di output della compilazione corrente. L'opzione /main risolve il punto di ingresso all'interno di un singolo assembly di output e non può fare riferimento ai tipi compilati in un output diverso (CS1557).
  • Verificare che il tipo specificato sia definito nel codice sorgente del progetto corrente anziché in un assembly a cui si fa riferimento. Il compilatore non può designare un tipo importato come punto di ingresso (CS1559).
  • Rimuovere l'opzione /main quando si compila una libreria o un modulo. Solo i progetti eseguibili (con outputTypeexe o winexe) hanno punti di ingresso (CS2017). Se è necessario un punto di ingresso, modificare il tipo di output in un eseguibile.
  • Verificare che il tipo specificato da StartupObject dichiari un metodo valido Main . Se il tipo esiste ma non contiene un metodo statico Main appropriato, il compilatore genera l'errore CS1558. Vedere la sezione relativa alla Main dichiarazione del metodo per la firma richiesta.

Annotazioni

CS1557 e CS1559 sono diagnostiche legacy che il compilatore C# attuale non produce. Gli scenari che hanno attivato questi errori non sono più supportati o si verificano troppo raramente per garantire il rilevamento.

Annotazioni

CS1555 e CS1556 vengono segnalati solo durante le operazioni di compilazione o ricompilazione . Non vengono visualizzati come diagnostica di IntelliSense durante la digitazione nell'IDE.

Istruzioni di livello superiore

  • CS7022: il punto di ingresso del programma è codice globale, ignorando il punto di ingresso '{0}'.
  • CS8801: impossibile usare la variabile locale o la funzione locale '{0}' dichiarata in un'istruzione di primo livello in questo contesto.
  • CS8802: solo un'unità di compilazione può avere istruzioni di primo livello.
  • CS8803: le istruzioni di primo livello devono precedere le dichiarazioni dello spazio dei nomi e dei tipi.
  • CS8805: il programma che usa istruzioni di primo livello deve essere un eseguibile.
  • CS8937: Almeno un'istruzione di primo livello non deve essere vuota.

Le istruzioni di primo livello sostituiscono il metodo esplicito Main come punto di ingresso del programma. Per altre informazioni, vedere Istruzioni di primo livello nella guida per programmatori C# e nella specifica di funzionalità delle istruzioni di primo livello .

Per correggere questi errori, assicura che l'utilizzo delle istruzioni di primo livello segua queste regole:

  • Consolidare tutte le istruzioni di primo livello in un singolo file, perché solo un'unità di compilazione (file) può contenere istruzioni di primo livello (CS8802). Spostare qualsiasi codice di primo livello da altri file in quel singolo file. Ristrutturare i file rimanenti in modo che contengano solo dichiarazioni di namespace e tipi.
  • Posizionare tutte le istruzioni di primo livello prima di qualsiasi namespace dichiarazione o type nel file, perché il compilatore richiede che le istruzioni di primo livello vengano visualizzate per prime (CS8803). Se si dispone di direttive using, tali direttive possono comunque precedere le istruzioni di primo livello.
  • Includere almeno un'istruzione contenente codice eseguibile, perché un file con solo istruzioni vuote, spazi vuoti o commenti non è idoneo come punto di ingresso valido (CS8937). Aggiungere un'istruzione, ad esempio una chiamata al metodo, un'assegnazione di variabile o un'espressione per soddisfare il requisito.
  • Accedere alle variabili locali e alle funzioni locali dichiarate nelle istruzioni di primo livello solo dall'interno del contesto dell'istruzione di primo livello, perché tali dichiarazioni hanno come ambito il metodo del punto di ingresso generato e non sono visibili ad altri file o ai membri di tipo dichiarati nello stesso file (CS8801). Se è necessario condividere lo stato tra i file, dichiarare invece la variabile come campo statico o proprietà in un tipo.
  • Impostare OutputType del progetto su exe, perché le istruzioni di primo livello definiscono un punto di ingresso e i punti di ingresso sono validi solo nei progetti eseguibili (CS8805). Se si sta creando una libreria, rimuovere le istruzioni di primo livello e usare invece tipi e metodi.
  • Rimuovere o rinominare qualsiasi metodo esplicito Main quando sono presenti istruzioni di primo livello, perché il compilatore considera le istruzioni di primo livello come punto di ingresso e ignora qualsiasi Main metodo, generando un avviso (CS7022). Se si intende usare un metodo esplicito Main, spostare il codice delle istruzioni di primo livello in tale metodo e rimuovere le istruzioni di primo livello.