Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье рассматриваются следующие ошибки и предупреждения компилятора:
- CS0017. Имя выходного файла программы имеет несколько точек входа. Скомпилируйте с помощью /main, чтобы указать тип, содержащий точку входа.
- CS0028: «объявление функции» имеет неправильную сигнатуру для точки входа
- CS0402: "идентификатор": точка входа не может быть универсальной или в универсальном типе
- CS1555: не удалось найти класс, указанный для метода Main
- CS1556: "конструктор", указанный для метода Main, должен быть допустимым классом или структурой
- CS1557: не удается использовать класс для метода Main, так как он находится в другом выходном файле
- CS1558: "class" не имеет подходящего статического метода Main
- CS1559: не удается использовать "object" для метода Main, так как он импортирован
- CS2017: не удается указать /main при создании модуля или библиотеки
- CS5001: программа не содержит статический метод Main, подходящий для точки входа.
- CS7022: точка входа программы — это глобальный код, игнорирующий точку входа '{0}' .
- CS8801: не удается использовать локальную переменную или локальную функцию"{0}, объявленную в инструкции верхнего уровня в этом контексте.
- CS8802: Только один компиляционный модуль может иметь операторы верхнего уровня.
- CS8803: Выражения верхнего уровня должны предшествовать объявлениям пространства имен и типов.
- CS8805: программа с использованием инструкций верхнего уровня должна быть исполняемым файлом.
- CS8899: точки входа приложений не могут быть атрибутом UnmanagedCallersOnly.
- CS8937: по крайней мере одна инструкция верхнего уровня должна быть непустой.
Main Объявление метода
- CS0017. Имя выходного файла программы имеет несколько точек входа. Скомпилируйте с помощью /main, чтобы указать тип, содержащий точку входа.
- CS0028: объявление функции имеет неправильную сигнатуру для точки входа
- CS0402: "идентификатор": точка входа не может быть универсальной или в универсальном типе
- CS1558: "class" не имеет подходящего статического метода Main
- CS5001: программа не содержит статический метод Main, подходящий для точки входа.
- CS8899: точки входа приложений не могут быть атрибутом UnmanagedCallersOnly.
Программа, компилируемая в исполняемый файл, должна содержать допустимый Main метод в качестве точки входа. Дополнительные сведения см. в статьях Main() и аргументов командной строки.
Чтобы исправить эти ошибки, убедитесь, что Main объявление метода следует следующим правилам:
- Объявите
Mainметод какstaticс типом возвращаемого значенияvoid,intилиTask, так как среда выполненияTask<int>требует определенной подписи для идентификации точки входа программы (CS0028, CS1558). Метод может при необходимости приниматьstring[]параметр для аргументов командной строки. Если используетсяasyncмодификатор, тип возвращаемого значения должен бытьTaskилиTask<int>, и необходимо использовать язык C# версии 7.1 или более поздней. - Переместите
Mainметод из любого обобщённого типа, так как среда выполнения не может определить уникальную точку входа, если для содержащего типа требуются аргументы типа (CS0402). - Удалите атрибут UnmanagedCallersOnlyAttribute из метода
Main, потому что точки входа должны вызываться из управляемого кода, аUnmanagedCallersOnlyограничивает вызов метода только неуправляемыми вызывающими (CS8899). - Если код содержит несколько
Mainметодов в разных типах, используйте параметр компилятора StartupObject , чтобы указать, какой тип содержит предназначенную точку входа (CS0017). Без этого параметра компилятор не может определить, какойMainметод следует использовать. - Убедитесь, что исполняемый проект определяет
Mainметод с правильной подписью, так как для проекта с outputTypeexe или winexe требуется точка входа (CS5001, CS1558). Имя метода чувствительно к регистру -mainне подходит. Если исполняемый файл не нужен, измените тип вывода на библиотеку.
Замечание
CS0028 — это устаревшая диагностика, которую текущий компилятор C# не выдает. Современные версии компилятора сообщают CS1558 или CS5001, если метод Main имеет недопустимую сигнатуру.
Замечание
CS0017, CS0028, CS0402, CS1558 и CS5001 сообщаются только во время операций сборки или перестроения . Они не отображаются как диагностические предупреждения IntelliSense во время набора текста в интегрированной среде разработки.
Параметр компилятора StartupObject
- CS1555: не удалось найти класс, указанный для метода Main
- CS1556: "конструктор", указанный для метода Main, должен быть допустимым классом или структурой
- CS1557: не удается использовать класс для метода Main, так как он находится в другом выходном файле
- CS1559: не удается использовать "object" для метода Main, так как он импортирован
- CS2017: не удается указать /main при создании модуля или библиотеки
Параметр компилятора StartupObject (также известный как /main) указывает, какой тип содержит метод программы Main при определении нескольких типов. Дополнительные сведения см. в статьях StartupObject и Main() и аргументов командной строки.
Чтобы исправить эти ошибки, убедитесь, что StartupObject параметр ссылается на допустимый тип:
- Убедитесь, что полное имя класса, которое вы передаете в
StartupObject, соответствует типу, определенному в исходном коде текущей компиляции. Компилятор выполняет поиск только в исходных файлах, которые компилируются, а не в сборках, на которые ссылаются, для указанного типа (CS1555). Проверьте опечатки в полном имени, включая пространство имен. - Убедитесь, что идентификатор, который вы передаете в
StartupObject, относится к неготовомуclassилиstruct. Компилятору требуется конкретный тип, который может содержать допустимыйMainметод (CS1556). Интерфейсы, перечисления, делегаты и универсальные типы не являются допустимыми целевыми объектами. - Переместите указанный класс в тот же выходной файл, что и текущая компиляция. Параметр
/mainопределяет точку входа в одной итоговой сборке и не может ссылаться на типы, содержащиеся в другой сборке (CS1557). - Убедитесь, что указанный тип определен в исходном коде текущего проекта, а не в указанной сборке. Компилятор не может назначить импортированный тип как точку входа (CS1559).
-
/mainУдалите параметр при создании библиотеки или модуля. Только исполняемые проекты (с OutputTypeexe или winexe) имеют точки входа (CS2017). Если вам нужна точка входа, измените тип выходных данных на исполняемый файл. - Убедитесь, что тип, указанный в
StartupObject, объявляет допустимый методMain. Если тип существует, но не содержит подходящий статическийMainметод, компилятор создает CS1558. См.Mainраздел объявления метода для требуемой сигнатуры.
Замечание
CS1557 и CS1559 — это устаревшие диагностические сообщения, которые не генерируются текущим компилятором C#. Сценарии, которые вызвали эти ошибки, больше не поддерживаются или происходят слишком редко, чтобы гарантировать обнаружение.
Замечание
CS1555 и CS1556 сообщаются только во время операций сборки или перестроения. Они не отображаются как диагностика IntelliSense во время ввода в интегрированной среде разработки.
Инструкции верхнего уровня
- CS7022: точка входа программы — это глобальный код, игнорирующий точку входа '{0}' .
- CS8801: не удается использовать локальную переменную или локальную функцию"{0}, объявленную в инструкции верхнего уровня в этом контексте.
- CS8802: только один компиляционный блок может содержать операторы верхнего уровня.
- CS8803: инструкции верхнего уровня должны предшествовать объявлениям пространства имен и типов.
- CS8805: программа с использованием инструкций верхнего уровня должна быть исполняемым файлом.
- CS8937: по крайней мере одна инструкция верхнего уровня должна быть непустой.
Операторы верхнего уровня заменяют явный Main метод точкой входа программы. Дополнительные сведения см. в инструкциях верхнего уровня в руководстве по программированию на C# и спецификации функций инструкций верхнего уровня .
Чтобы исправить эти ошибки, убедитесь, что вы используете инструкции верхнего уровня, следуя этим правилам:
- Консолидируйте все операторы верхнего уровня в один файл, так как только одна единица компиляции (файл) может содержать инструкции верхнего уровня (CS8802). Переместите любой код верхнего уровня из других файлов в один файл. Переструктурируйте оставшиеся файлы так, чтобы они содержали только пространства имен и объявления типов.
- Поместите все инструкции верхнего уровня перед любым
namespaceилиtypeобъявлением в файле, так как компилятору требуется, чтобы операторы верхнего уровня отображались в первую очередь (CS8803). Если у вас естьusingдирективы, эти директивы по-прежнему могут предшествовать операторам верхнего уровня. - Включите по крайней мере одну инструкцию, содержащую исполняемый код, так как файл с пустыми операторами, пробелами или комментариями не соответствует допустимой точке входа (CS8937). Добавьте инструкцию, например вызов метода, назначение переменной или выражение для удовлетворения требования.
- Доступ к локальным переменным и локальным функциям, объявленным в операторах верхнего уровня, возможен только из контекста самих операторов верхнего уровня, так как эти объявления связаны с созданным методом точки входа и не видны для других файлов или для членов типов, объявленных в том же файле (CS8801). Если необходимо предоставить общий доступ к состоянию между файлами, объявите переменную как статическое поле или свойство для типа.
- Задайте для объекта OutputType значение exe, так как операторы верхнего уровня определяют точку входа и точки входа допустимы только в исполняемых проектах (CS8805). Если вы создаете библиотеку, удалите инструкции верхнего уровня и используйте типы и методы.
- Удалите или переименуйте любой явный
Mainметод при наличии инструкций верхнего уровня, так как компилятор обрабатывает операторы верхнего уровня как точку входа и игнорирует любойMainметод, создавая предупреждение (CS7022). Если вы планируете использовать явныйMainметод, переместите код инструкций верхнего уровня в этот метод и удалите инструкции верхнего уровня.