Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo aborda os seguintes erros e avisos do compilador:
- CS0017: O programa 'nome do arquivo de saída' tem mais de um ponto de entrada definido. Compile 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 em um tipo genérico
- CS1555: Não foi possível localizar a 'classe' especificada para o método Main
- CS1556: 'construct' especificado para o método Main deve ser uma classe ou struct válido
- CS1557: Não é possível usar 'class' para o método Main porque ele está em um arquivo de saída diferente
- CS1558: 'class' não tem um método principal estático adequado
- CS1559: Não é possível usar o método 'object' for Main porque ele é importado
- CS2017: Não é possível especificar /principal se estiver criando um módulo ou biblioteca
- CS5001: O programa não contém um método 'Main' estático adequado para um ponto de entrada
- CS7022: o ponto de entrada do programa é o código global; ignorando o ponto de entrada '{0}'.
- CS8801: não é possível usar a variável local ou a função local '{0}' declarada em uma instrução de nível superior neste contexto.
- CS8802: apenas uma unidade de compilação pode ter instruções de nível superior.
- CS8803: instruções de nível superior devem preceder declarações de tipo e namespace.
- CS8805: o programa que usa instruções de nível superior deve ser executável.
- CS8899: Os pontos de entrada do aplicativo não podem ser atribuídos com 'UnmanagedCallersOnly'.
- CS8937: Pelo menos uma instrução de nível superior não pode estar vazia.
Main declaração de método
- CS0017: O programa 'nome do arquivo de saída' tem mais de um ponto de entrada definido. Compile 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 em um tipo genérico
- CS1558: 'class' não tem um método principal estático adequado
- CS5001: O programa não contém um método 'Main' estático adequado para um ponto de entrada
- CS8899: Os pontos de entrada do aplicativo não podem ter o atributo 'UnmanagedCallersOnly'.
Um programa compilado em um executável deve conter um método válido Main como seu ponto de entrada. Para obter mais informações, consulte Main() e argumentos de linha de comando.
Para corrigir esses erros, verifique se a Main declaração do método segue estas regras:
- Declare o
Mainmétodo comostaticcom um tipo de retorno devoid,intouTaskTask<int>, porque o runtime requer uma assinatura específica para identificar o ponto de entrada do programa (CS0028, CS1558). Opcionalmente, o método pode aceitar umstring[]parâmetro para argumentos de linha de comando. Se você usar oasyncmodificador, o tipo de retorno deverá serTaskouTask<int>, e você deverá usar a versão da linguagem C# 7.1 ou superior. - Mova o
Mainmétodo para fora de qualquer tipo genérico, pois o runtime não pode resolver um ponto de entrada exclusivo quando o tipo que contém requer argumentos de tipo (CS0402). - Remova o UnmanagedCallersOnlyAttribute atributo do método, pois os
Mainpontos de entrada devem ser chamáveis do código gerenciado eUnmanagedCallersOnlyrestringem o método somente a chamadores não gerenciados (CS8899). - Quando o código contiver vários
Mainmétodos em diferentes tipos, use a opção do compilador StartupObject para especificar qual tipo contém o ponto de entrada pretendido (CS0017). Sem essa opção, o compilador não pode determinar qualMainmétodo usar. - Verifique se o projeto executável define um
Mainmétodo com uma assinatura correta, pois um projeto com um OutputType de exe ou winexe requer um ponto de entrada (CS5001, CS1558). O nome do método diferencia maiúsculas de minúsculas -mainnão atende aos critérios. Se você não precisar de um executável, altere o tipo de saída para biblioteca.
Observação
CS0028 é um diagnóstico herdado que o compilador C# atual não produz. As versões modernas do compilador relatam CS1558 ou CS5001, em vez disso, quando o método Main tem uma assinatura inválida.
Observação
CS0017, CS0028, CS0402, CS1558 e CS5001 são relatados somente durante operações build ou rebuild . Eles não aparecem como diagnósticos do IntelliSense enquanto você digita no IDE.
Opção do compilador StartupObject
- CS1555: Não foi possível localizar a 'classe' especificada para o método Main
- CS1556: 'construtor' 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 ele está em um arquivo de saída diferente
- CS1559: Não é possível usar o método 'object' for Main porque ele é importado
- CS2017: Não é possível especificar /principal se estiver criando um módulo ou biblioteca
A opção do compilador StartupObject (também conhecida como /main) especifica qual tipo contém o método do Main programa quando vários tipos definem um. Para obter mais informações, consulte StartupObject e Main() e argumentos de linha de comando.
Para corrigir esses erros, assegure-se de que a opção StartupObject faz referência a um tipo válido.
- Verifique se o nome de classe totalmente qualificado que você passa ao
StartupObjecté compatível com um tipo que deve estar definido no código-fonte da compilação atual. O compilador busca apenas os arquivos fonte que estão sendo compilados - e não os assemblies referenciados - para o tipo especificado (CS1555). Verifique se há erros de digitação no nome totalmente qualificado, incluindo o namespace. - Verifique se o identificador que você passa para
StartupObjectse refere a umclassoustructnão genérico. O compilador requer um tipo concreto que pode conter um método válidoMain(CS1556). Interfaces, enums, delegados e tipos genéricos não são alvos válidos. - Mova a classe especificada para o mesmo arquivo de saída que a compilação atual. A opção
/mainresolve o ponto inicial em um único assembly de saída e não pode fazer referência a tipos compilados em uma saída diferente (CS1557). - Verifique se o tipo especificado está definido no código-fonte do projeto atual em vez de em um assembly referenciado. O compilador não pode designar um tipo importado como o ponto de entrada (CS1559).
- Remova a opção
/mainao criar uma biblioteca ou módulo. Somente projetos executáveis (com um OutputType de exe ou winexe) têm pontos de entrada (CS2017). Se você precisar de um ponto de entrada, altere o tipo de saída para um executável. - Verifique se o tipo especificado por
StartupObjectdeclara um métodoMainválido. Se o tipo existir, mas não contiver um método estáticoMainadequado, o compilador gerará CS1558. Veja a seçãodeclaração de método para a assinatura necessária.
Observação
CS1557 e CS1559 são diagnósticos herdados que o compilador C# atual não produz. Os cenários que dispararam esses erros não têm mais suporte ou ocorrem com pouca frequência para justificar a detecção.
Observação
CS1555 e CS1556 são relatados somente durante operações build ou rebuild . Eles não aparecem como diagnósticos do IntelliSense enquanto você digita no IDE.
Instruções de nível superior
- CS7022: o ponto de entrada do programa é o código global; ignorando o ponto de entrada '{0}'.
- CS8801: não é possível usar a variável local ou a função local '{0}' declarada em uma instrução de nível superior neste contexto.
- CS8802: apenas uma unidade de compilação pode ter instruções de nível superior.
- CS8803: instruções de nível superior devem preceder declarações de tipo e namespace.
- CS8805: o programa que usa instruções de nível superior deve ser executável.
- CS8937: pelo menos uma instrução de nível superior deve não estar vazia.
Instruções de nível superior substituem o método explícito Main como o ponto de entrada do programa. Para obter mais informações, consulte instruções de nível superior no guia de programação em C# e a especificação de recurso de instruções de nível superior .
Para corrigir esses erros, verifique se o uso de instruções de nível superior segue estas regras:
- Consolide todas as instruções de nível superior em um único arquivo, pois apenas uma unidade de compilação (arquivo) pode conter instruções de nível superior (CS8802). Mova qualquer código de nível superior de outros arquivos para esse único arquivo. Reestruturar os arquivos restantes para que eles contenham apenas declarações de namespace e tipo.
- Coloque todas as instruções de nível superior antes de qualquer
namespacedeclaração outypedeclarações no arquivo, pois o compilador requer que as instruções de nível superior apareçam primeiro (CS8803). Se você tiverusingdiretivas, essas diretivas ainda podem preceder as instruções de nível superior. - Inclua pelo menos uma instrução que contenha código executável, pois um arquivo com apenas instruções vazias, espaço em branco ou comentários não se qualifica como um 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 atender ao requisito.
- Acesse variáveis locais e funções locais declaradas em instruções de nível superior somente de dentro do próprio contexto de instrução de nível superior, pois essas declarações têm como escopo o método de ponto de entrada gerado e não são visíveis para outros arquivos ou para digitar membros declarados no mesmo arquivo (CS8801). Se você precisar compartilhar o estado entre arquivos, declare a variável como um campo estático ou propriedade em um tipo.
- Defina o OutputType do projeto como exe, porque instruções de nível superior definem um ponto de entrada e pontos de entrada são válidos apenas em projetos executáveis (CS8805). Se você estiver criando uma biblioteca, remova as instruções de nível superior e use tipos e métodos.
- Remova ou renomeie qualquer método explícito
Mainquando instruções de nível superior estiverem presentes, pois o compilador trata as instruções de nível superior como o ponto de entrada e ignora qualquerMainmétodo, produzindo um aviso (CS7022). Se você pretende usar um método explícitoMain, mova o código da instrução de nível superior para esse método e remova as instruções de nível superior.