Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo aborda os seguintes erros e avisos do compilador:
- CS0017: O 'nome do ficheiro de saída' do programa tem mais do que um ponto de entrada definido. Compila com /main para especificar o tipo que contém o ponto de entrada.
- CS0028: 'declaração de função' tem a assinatura errada para ser um ponto de entrada
- CS0402: 'identificador': um ponto de entrada não pode ser genérico ou de tipo genérico
- CS1555:Não foi possível encontrar 'classe' especificada para o método Main
- CS1556: 'construct' especificado para o método Main deve ser uma classe ou struct válida
- CS1557: Não é possível usar 'class' para o método Main porque está num ficheiro de saída diferente
- CS1558: 'classe' não possui um método principal estático adequado
- CS1559: Não pode usar 'object' para o método Main porque é importado
- CS2017: Não é possível especificar /main se estiver a construir um módulo ou biblioteca
- CS5001: O programa não contém um método estático 'Main' adequado para um ponto de entrada
- CS7022:O ponto de entrada do programa é o código global; ignorando o '{0}'ponto de entrada.
- CS8801: Não pode usar variável local ou função local '{0}' declarada numa instrução de topo neste contexto.
- CS8802: Apenas uma unidade de compilação pode ter instruções de nível superior.
- CS8803: As instruções de topo devem preceder declarações de namespace e tipos.
- CS8805: O programa que utiliza instruções de topo deve ser um executável.
- CS8899:Os pontos de entrada da aplicação não podem ser atribuídos com 'UnmanagedCallersOnly'.
- CS8937: Pelo menos uma declaração de nível superior deve não estar vazia.
Main Declaração do método
- CS0017: O 'nome do ficheiro de saída' do programa tem mais do que um ponto de entrada definido. Compila com /main para especificar o tipo que contém o ponto de entrada.
- CS0028: 'declaração de função' tem a assinatura errada para ser um ponto de entrada
- CS0402: 'identificador': um ponto de entrada não pode ser genérico ou de tipo genérico
- CS1558: 'classe' não possui um método principal estático adequado
- CS5001: O programa não contém um método estático 'Main' adequado para um ponto de entrada
- CS8899:Os pontos de entrada da aplicação não podem ter o atributo 'UnmanagedCallersOnly'.
Um programa que compila para um executável deve conter um método válido Main como ponto de entrada. Para mais informações, veja Main() e argumentos de linha de comandos.
Para corrigir estes erros, certifique-se de que a sua Main declaração de método segue estas regras:
- Declare o
Mainmétodo comostaticcom um tipo de retorno devoid,int,Task, ouTask<int>, porque o tempo de execução requer uma assinatura específica para identificar o ponto de entrada do programa (CS0028, CS1558). O método pode, opcionalmente, aceitar umstring[]parâmetro para argumentos de linha de comandos. Se usar o modificadorasync, o tipo de retorno deve serTaskouTask<int>, e deverá apontar para a versão da linguagem C# 7.1 ou superior. - Move o
Mainmétodo para fora de qualquer tipo genérico, porque o runtime não consegue resolver um ponto de entrada único quando o tipo que contém requer argumentos de tipo (CS0402). - Remover o UnmanagedCallersOnlyAttribute atributo do
Mainmétodo, porque os pontos de entrada devem ser chamáveis a partir de código gerido eUnmanagedCallersOnlyrestringe o método apenas a chamadores não geridos (CS8899). - Quando o seu código contém múltiplos
Mainmétodos de diferentes tipos, use a opção do compilador StartupObject para especificar qual o tipo que contém o ponto de entrada pretendido (CS0017). Sem essa opção, o compilador não consegue determinar qualMainmétodo usar. - Verifique se o seu projeto executável define um
Mainmétodo com uma assinatura correta, porque um projeto com um OutputType de exe ou winexe requer um ponto de entrada (CS5001, CS1558). O nome do método é sensível a maiúsculas e minúsculas –mainnão atende o requisito. Se não precisares de um executável, muda o tipo de saída para biblioteca.
Observação
O CS0028 é um diagnóstico legado que o compilador C# atual não produz. Versões modernas do compilador reportam CS1558 ou CS5001 quando o Main método tem uma assinatura inválida.
Observação
CS0017, CS0028, CS0402, CS1558 e CS5001 são reportados apenas durante as operações de Construção ou Reconstrução . Eles não aparecem como diagnósticos do IntelliSense enquanto escreves no IDE.
StartupObject opção do compilador
- CS1555:Não foi possível encontrar 'classe' especificada para o método Main
- CS1556: 'construct' especificado para o método Main deve ser uma classe ou struct válida
- CS1557: Não é possível usar 'class' para o método Main porque está num ficheiro de saída diferente
- CS1559: Não pode usar 'object' para o método Main porque é importado
- CS2017: Não é possível especificar /main se estiver a construir um módulo ou biblioteca
A opção StartupObject do compilador (também conhecida como /main) especifica qual tipo contém o método Main do programa quando múltiplos tipos definem um. Para mais informações, veja StartupObject e Main() e argumentos de linha de comandos.
Para corrigir estes erros, certifique-se de que a StartupObject opção faz referência a um tipo válido:
- Verifique se o nome totalmente qualificado da classe que você passa para
StartupObjectcorresponde a um tipo definido no código-fonte da compilação atual. O compilador pesquisa apenas nos ficheiros fonte a compilar – não em assemblies referenciados – o tipo especificado (CS1555). Verifique se há erros tipográficos no nome totalmente qualificado, incluindo o espaço de nomes. - Certifique-se de que o identificador que passa para
StartupObjectse refere a umclassoustructnão genérico. O compilador requer um tipo concreto que possa conter um método válidoMain(CS1556). Interfaces, enums, delegates e tipos genéricos não são alvos válidos. - Mover a classe especificada para o mesmo ficheiro de saída da compilação atual. A
/mainopção resolve o ponto de entrada dentro de um único conjunto de saída e não pode referenciar tipos compilados numa saída diferente (CS1557). - Assegure-se de que o tipo especificado está definido no código-fonte do projeto atual, em vez de num assembly referenciado. O compilador não pode designar um tipo importado como ponto de entrada (CS1559).
- Remova essa
/mainopção ao construir uma biblioteca ou módulo. Apenas os projetos executáveis (com um OutputType de exe ou winexe) têm pontos de entrada (CS2017). Se precisares de um ponto de entrada, muda o tipo de saída para um executável. - Assegure que o tipo especificado por
StartupObjectdeclara um método válidoMain. Se o tipo existir mas não contiver um método estáticoMainadequado, o compilador gera o CS1558. Consulte aMainsecção de declaração de método para a assinatura necessária.
Observação
CS1557 e CS1559 são diagnósticos legados que o compilador C# atual não produz. Os cenários que desencadearam estes erros já não são suportados ou ocorrem com demasiada pouca frequência para justificar a deteção.
Observação
CS1555 e CS1556 são reportados apenas durante as operações de Construção ou Reconstrução . Eles não aparecem como diagnósticos do IntelliSense enquanto escreves no IDE.
Declarações de nível superior
- CS7022:O ponto de entrada do programa é o código global; ignorando o '{0}'ponto de entrada.
- CS8801: Não pode usar variável local ou função local '{0}' declarada numa instrução de topo neste contexto.
- CS8802: Apenas uma unidade de compilação pode ter instruções de nível superior.
- CS8803: As instruções de topo devem preceder declarações de namespace e tipos.
- CS8805: O programa que utiliza instruções de topo deve ser um executável.
- CS8937: Pelo menos uma instrução de nível superior não pode estar vazia.
As instruções de topo substituem o método explícito Main como ponto de entrada do programa. Para mais informações, consulte Instruções de nível superior no guia de programação C# e a especificação de instruções de nível superior.
Para corrigir estes erros, certifique-se de que a utilização de instruções de topo segue estas regras:
- Consolide todas as instruções de topo num único ficheiro, pois apenas uma unidade de compilação (ficheiro) pode conter instruções de topo (CS8802). Mover qualquer código de nível superior de outros ficheiros para um único ficheiro. Reestruturar os ficheiros restantes para que contenham apenas declarações de namespace e tipos.
- Coloque todas as declarações de nível superior antes de qualquer declaração de
namespaceoutypeno ficheiro, porque o compilador exige que as declarações de nível superior apareçam primeiro (CS8803). Se tiverusingdiretivas, essas diretivas ainda podem preceder as declarações de nível superior. - Inclua pelo menos uma instrução que contenha código executável, porque um ficheiro com apenas instruções vazias, espaços em branco ou comentários não qualifica como ponto de entrada válido (CS8937). Adicione uma instrução como uma chamada de método, atribuição de variável ou expressão para satisfazer o requisito.
- Aceda a variáveis locais e funções locais declaradas em declarações no nível superior apenas dentro do próprio contexto da declaração de nível superior, porque essas declarações estão limitadas ao escopo do método de entrada gerado e não são visíveis para outros ficheiros ou para os membros de tipo declarados no mesmo ficheiro (CS8801). Se precisares de partilhar estado entre ficheiros, declara a variável como um campo estático ou propriedade num tipo.
- Defina o OutputType do projeto como exe, porque as instruções de topo definem um ponto de entrada e os pontos de entrada só são válidos em projetos executáveis (CS8805). Se estiveres a construir uma biblioteca, remove as instruções de topo e usa em vez disso tipos e métodos.
- Remover ou renomear qualquer método explícito
Mainquando houver instruções de topo presentes, porque o compilador trata as instruções de topo como ponto de entrada e ignora qualquerMainmétodo, produzindo um aviso (CS7022). Se pretende usar um método explícitoMain, mova o código das declarações de nível superior para esse método e remova as declarações de nível superior.