Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
Mainmetodo comestaticcon un tipo restituito divoid,int,TaskoTask<int>, perché il runtime richiede una firma specifica per identificare il punto di ingresso del programma (CS0028, CS1558). Facoltativamente, il metodo può accettare unstring[]parametro per gli argomenti della riga di comando. Se si utilizza ilasyncmodificatore, il tipo restituito deve essereTaskoTask<int>, e bisogna usare la linguaggio C# versione 7.1 o superiore. - Spostare il
Mainmetodo 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
Mainpunti di ingresso devono essere chiamabili dal codice gestito eUnmanagedCallersOnlylimitano il metodo solo ai chiamanti non gestiti (CS8899). - Quando il codice contiene più
Mainmetodi 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 qualeMainmetodo usare. - Verificare che il progetto eseguibile definisca un
Mainmetodo 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 -mainnon 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
StartupObjectcorrisponda 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
StartupObjectfaccia riferimento a un oggetto non genericoclassostruct. Il compilatore richiede un tipo concreto che può contenere un metodo validoMain(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
/mainrisolve 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
/mainquando 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
StartupObjectdichiari un metodo validoMain. Se il tipo esiste ma non contiene un metodo staticoMainappropriato, il compilatore genera l'errore CS1558. Vedere la sezione relativa allaMaindichiarazione 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
namespacedichiarazione otypenel file, perché il compilatore richiede che le istruzioni di primo livello vengano visualizzate per prime (CS8803). Se si dispone di direttiveusing, 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
Mainquando sono presenti istruzioni di primo livello, perché il compilatore considera le istruzioni di primo livello come punto di ingresso e ignora qualsiasiMainmetodo, generando un avviso (CS7022). Se si intende usare un metodo esplicitoMain, spostare il codice delle istruzioni di primo livello in tale metodo e rimuovere le istruzioni di primo livello.