Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se tratan los siguientes errores y advertencias del compilador:
- CS0017: el programa "nombre del archivo de salida" tiene más de un punto de entrada definido. Compile con /main para especificar el tipo que contiene el punto de entrada.
- CS0028: "declaración de función" tiene la firma incorrecta para ser un punto de entrada
- CS0402: 'identifier': un punto de entrada no puede ser genérico o en un tipo genérico
- CS1555: No se pudo encontrar la 'clase' especificada para el método Main
- CS1556: 'construct' especificado para el método Main debe ser una clase o estructura válida.
- CS1557: No se puede usar 'class' para el método Main porque está en un archivo de salida diferente
- CS1558: 'class' no tiene un método Main estático adecuado
- CS1559: No se puede usar 'object' para el método Main porque se importa
- CS2017: No se puede especificar /main si se crea un módulo o biblioteca
- CS5001: El programa no contiene un método estático "Main" adecuado para un punto de entrada
- CS7022: el punto de entrada del programa es código global; omite el punto de entrada "{0}".
- CS8801: no se puede usar la variable local o la función local '{0}' declarada en una instrucción de nivel superior en este contexto.
- CS8802: solo una unidad de compilación puede tener instrucciones de nivel superior.
- CS8803: las instrucciones de nivel superior deben preceder a las declaraciones de espacio de nombres y tipos.
- CS8805: el programa que usa instrucciones de nivel superior debe ser un ejecutable.
- CS8899: los puntos de entrada de la aplicación no se pueden atribuir con "UnmanagedCallersOnly".
- CS8937: al menos una instrucción de nivel superior debe no estar vacía.
Main declaración de método
- CS0017: el programa "nombre del archivo de salida" tiene más de un punto de entrada definido. Compile con /main para especificar el tipo que contiene el punto de entrada.
- CS0028: La declaración de función tiene la signatura incorrecta para actuar como punto de entrada
- CS0402: 'identifier': un punto de entrada no puede ser genérico ni estar dentro de un tipo genérico
- CS1558: 'class' no tiene un método Main estático adecuado
- CS5001: El programa no contiene un método estático "Main" adecuado para un punto de entrada
- CS8899: Los puntos de entrada de la aplicación no se pueden atribuir con 'UnmanagedCallersOnly'.
Un programa que se compila en un archivo ejecutable debe contener un método válido Main como punto de entrada. Para obtener más información, vea Main() y argumentos de línea de comandos.
Para corregir estos errores, asegúrese de que la Main declaración del método sigue estas reglas:
- Declare el
Mainmétodo comostaticcon un tipo de valor devuelto devoid,int,TaskoTask<int>, porque el tiempo de ejecución requiere una firma específica para identificar el punto de entrada del programa (CS0028, CS1558). El método puede aceptar opcionalmente unstring[]parámetro para los argumentos de la línea de comandos. Si usa elasyncmodificador , el tipo de valor devuelto debe serTaskoTask<int>y debe tener como destino la versión 7.1 o posterior del lenguaje C# . - Mueva el
Mainmétodo fuera de cualquier tipo genérico, ya que el tiempo de ejecución no puede resolver un punto de entrada único cuando el tipo contenedor requiere argumentos de tipo (CS0402). - Quite el UnmanagedCallersOnlyAttribute atributo del
Mainmétodo , ya que los puntos de entrada deben ser invocables desde código administrado yUnmanagedCallersOnlyrestringe el método solo a los autores de llamadas no administrados (CS8899). - Cuando el código contiene varios
Mainmétodos en distintos tipos, use la opción del compilador StartupObject para especificar qué tipo contiene el punto de entrada previsto (CS0017). Sin esa opción, el compilador no puede determinar quéMainmétodo usar. - Compruebe que el proyecto ejecutable define un
Mainmétodo con una firma correcta, ya que un proyecto con outputType de exe o winexe requiere un punto de entrada (CS5001, CS1558). El nombre del método distingue mayúsculas de minúsculas;mainno es válido. Si no necesita un archivo ejecutable, cambie el tipo de salida a biblioteca.
Nota:
CS0028 es un diagnóstico heredado que el compilador de C# actual no genera. Las versiones modernas del compilador informan de CS1558 o CS5001 cuando el Main método tiene una firma no válida.
Nota:
CS0017, CS0028, CS0402, CS1558 y CS5001 solo se notifican durante las operaciones de compilación o recompilación . No aparecen como diagnósticos de IntelliSense mientras usted escribe en el IDE.
Opción del compilador StartupObject
- CS1555: No se pudo encontrar la 'clase' especificada para el método Main
- CS1556: 'construct' especificado para el método Main debe ser una clase o estructura válida.
- CS1557: No se puede usar 'class' para el método Main porque está en un archivo de salida diferente
- CS1559: No se puede usar 'object' para el método Main porque se importa
- CS2017: No se puede especificar /main si se crea un módulo o biblioteca
La opción del compilador StartupObject (también conocida como /main) especifica qué tipo contiene el método del Main programa cuando varios tipos definen uno. Para obtener más información, vea StartupObject y Main() y argumentos de línea de comandos.
Para corregir estos errores, asegúrese de que la StartupObject opción hace referencia a un tipo válido:
- Verifique que el nombre de clase completo que pasa a
StartupObjectcoincida con un tipo definido en el código fuente de la compilación actual. El compilador busca solo los archivos de origen que se compilan (no se hace referencia a ensamblados) para el tipo especificado (CS1555). Compruebe si hay errores tipográficos en el nombre completo, incluido el espacio de nombres. - Asegúrese de que el identificador que usted pasa a
StartupObjecthace referencia a unclassostructno genérico. El compilador requiere un tipo concreto que pueda contener un método válidoMain(CS1556). Las interfaces, las enumeraciones, los delegados y los tipos genéricos no son objetivos válidos. - Mueva la clase especificada al mismo archivo de salida que la compilación actual. La
/mainopción resuelve el punto de entrada dentro de un único ensamblado de salida y no puede hacer referencia a tipos compilados en una salida diferente (CS1557). - Asegúrese de que el tipo especificado se define en el código fuente del proyecto actual en lugar de en un ensamblado al que se hace referencia. El compilador no puede designar un tipo importado como punto de entrada (CS1559).
- Quite la
/mainopción al compilar una biblioteca o un módulo. Solo los proyectos ejecutables (con outputType de exe o winexe) tienen puntos de entrada (CS2017). Si necesita un punto de entrada, cambie el tipo de salida a un archivo ejecutable. - Asegúrese de que el tipo especificado por
StartupObjectdeclara un método válidoMain. Si el tipo existe pero no contiene un método estáticoMainadecuado, el compilador genera la advertencia CS1558. Consulte la sección declaración delMainmétodo para obtener la firma necesaria.
Nota:
CS1557 y CS1559 son diagnósticos heredados que el compilador de C# actual no genera. Los escenarios que desencadenaron estos errores ya no se admiten o se producen demasiado poco frecuentemente para garantizar la detección.
Nota:
CS1555 y CS1556 solo se notifican durante las operaciones de compilación o recompilación . No aparecen como diagnósticos de IntelliSense mientras usted escribe en el IDE.
Declaraciones de nivel superior
- CS7022: el punto de entrada del programa es código global; omite el punto de entrada "{0}".
- CS8801: no se puede usar la variable local o la función local '{0}' declarada en una instrucción de nivel superior en este contexto.
- CS8802: solo una unidad de compilación puede tener instrucciones de nivel superior.
- CS8803: las instrucciones de nivel superior deben preceder a las declaraciones de espacio de nombres y tipos.
- CS8805: el programa que usa instrucciones de nivel superior debe ser un ejecutable.
- CS8937: Al menos una declaración de nivel superior debe contener algo.
Las instrucciones de nivel superior reemplazan el método explícito Main como punto de entrada del programa. Para obtener más información, vea Instrucciones de nivel superior en la guía de programación de C# y la especificación de características de instrucciones de nivel superior .
Para corregir estos errores, asegúrese de que el uso de instrucciones de nivel superior sigue estas reglas:
- Consolide todas las instrucciones de nivel superior en un único archivo, ya que solo una unidad de compilación (archivo) puede contener instrucciones de nivel superior (CS8802). Mueva cualquier código de nivel superior de otros archivos a ese único archivo. Reestructura los archivos restantes para que contengan solo declaraciones de espacios de nombres y tipos.
- Coloque todas las instrucciones de nivel superior antes de cualquier
namespacedeclaración otypeen el archivo, ya que el compilador requiere que las instrucciones de nivel superior aparezcan primero (CS8803). Si tieneusingdirectivas, esas directivas todavía pueden preceder a las instrucciones de nivel superior. - Incluya al menos una instrucción que contenga código ejecutable, ya que un archivo con solo instrucciones vacías, espacios en blanco o comentarios no califica como un punto de entrada válido (CS8937). Agregue una instrucción como una llamada de método, una asignación de variables o una expresión para satisfacer el requisito.
- Acceda a variables locales y funciones locales declaradas en estados de nivel superior solo desde el contexto del propio estado de nivel superior, ya que esas declaraciones se limitan al método del punto de entrada que se genera y no son visibles para otros archivos o para miembros de tipos declarados en el mismo archivo (CS8801). Si necesita compartir el estado entre archivos, declare la variable como un campo estático o una propiedad en un tipo en su lugar.
- Establezca outputType del proyecto en exe, ya que las instrucciones de nivel superior definen un punto de entrada y los puntos de entrada solo son válidos en proyectos ejecutables (CS8805). Si va a crear una biblioteca, quite las instrucciones de nivel superior y use en su lugar tipos y métodos.
- Quite o cambie el nombre de cualquier método explícito
Maincuando haya instrucciones de nivel superior, ya que el compilador trata las instrucciones de nivel superior como punto de entrada y omite cualquierMainmétodo, lo que genera una advertencia (CS7022). Si piensa usar un método explícitoMain, mueva el código de instrucción de nivel superior a ese método y quite las instrucciones de nivel superior.