Partilhar via


Resolver erros e avisos relacionados com um ponto de entrada de programa

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 Main método como static com um tipo de retorno de void, int, Task, ou Task<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 um string[] parâmetro para argumentos de linha de comandos. Se usar o modificador async, o tipo de retorno deve ser Task ou Task<int>, e deverá apontar para a versão da linguagem C# 7.1 ou superior.
  • Move o Main mé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 Main método, porque os pontos de entrada devem ser chamáveis a partir de código gerido e UnmanagedCallersOnly restringe o método apenas a chamadores não geridos (CS8899).
  • Quando o seu código contém múltiplos Main mé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 qual Main método usar.
  • Verifique se o seu projeto executável define um Main mé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 – main nã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 StartupObject corresponde 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 StartupObject se refere a um class ou struct não genérico. O compilador requer um tipo concreto que possa conter um método válido Main (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 /main opçã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 /main opçã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 StartupObject declara um método válido Main . Se o tipo existir mas não contiver um método estático Main adequado, o compilador gera o CS1558. Consulte a Main secçã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 namespace ou type no ficheiro, porque o compilador exige que as declarações de nível superior apareçam primeiro (CS8803). Se tiver using diretivas, 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 Main quando houver instruções de topo presentes, porque o compilador trata as instruções de topo como ponto de entrada e ignora qualquer Main método, produzindo um aviso (CS7022). Se pretende usar um método explícito Main, mova o código das declarações de nível superior para esse método e remova as declarações de nível superior.