Устранение ошибок и предупреждений, связанных с использованием директив и объявлений пространства имен

В этой статье рассматриваются следующие ошибки компилятора:

  • CS0101: ошибка: пространство имен "namespace" уже содержит определение для "identifier".
  • CS0104: ошибка: "reference" является неоднозначной ссылкой между "identifier" и "identifier".
  • CS0116: ошибка: пространство имен не может напрямую содержать элементы, такие как поля, методы или инструкции.
  • CS0138: ошибка: директива using для пространства имен может применяться только к пространствам имен; "type" — это тип, а не пространство имен.
  • CS0430: Ошибка: псевдоним extern "alias" не указан в параметре /reference.
  • CS0431: ошибка: не удается использовать псевдоним "identifier", :: так как псевдоним ссылается на тип. Используйте . вместо этого.
  • CS0432: Ошибка: псевдоним "идентификатор" не найден.
  • CS0434: ошибка: пространство имен NamespaceName1 в NamespaceName2 конфликтует с типом TypeName1 в NamespaceName3.
  • CS0438: ошибка: тип "type" в "module_1" конфликтует с пространством имен "namespace" в "module_2".
  • CS0439: ошибка: объявление extern alias должно предшествовать всем остальным элементам, определенным в пространстве имен.
  • CS0518: ошибка: предопределенный тип "type" не определен или импортирован.
  • CS0576: ошибка: пространство имен "пространство имен" содержит определение, конфликтующее с псевдонимом "идентификатор".
  • CS0687: ошибка: квалификатор :: пространства имен всегда разрешается в тип или пространство имен, поэтому здесь запрещено. Вместо этого рекомендуется использовать..
  • CS1022: Ошибка: ожидается определение типа, пространства имен или конец файла.
  • CS1527: ошибка: элементы, определенные в пространстве имен, не могут быть явно объявлены как private, protected, protected internal или private protected
  • CS1529: ошибка: предложение using должно предшествовать всем другим элементам, определенным в пространстве имен, кроме объявлений псевдонима extern.
  • CS1537: ошибка: псевдоним using 'alias' уже был объявлен в этом пространстве имен.
  • CS1671: ошибка: объявление пространства имен не может иметь модификаторы или атрибуты.
  • CS1679: ошибка: недопустимый псевдоним экстерна для '/reference'; "идентификатор" не является допустимым идентификатором.
  • CS1680: ошибка: недопустимый параметр псевдонима ссылки: "alias=" - отсутствует имя файла.
  • CS1681: ошибка: невозможно переопределить глобальный внешний псевдоним extern.
  • CS1730: ошибка: атрибуты сборки и модуля должны предшествовать всем остальным элементам, определенным в файле, за исключением директив using и объявлений extern alias.
  • CS2034: ошибка: параметр /reference, объявляющий экстерн-псевдоним, может иметь только одно имя файла. Чтобы указать несколько псевдонимов или имен файлов, используйте несколько параметров /reference.
  • CS7000: ошибка: неожиданное использование псевдонима.
  • CS7007: ошибка: директива using static может применяться только к типам. Вместо этого рассмотрите директиву using namespace.
  • CS7015: ошибка: "экстерн-псевдоним" недопустим в этом контексте.
  • CS7016: ошибка: псевдоним 'alias' конфликтует с определением вида символа
  • CS7021: ошибка: не удается объявить пространство имен в коде скрипта.
  • CS8083: ошибка: имя, уточнённое псевдонимом, не является выражением.
  • CS8085: ошибка: директива using static не может использоваться для объявления псевдонима.
  • CS8914: Ошибка: глобальная директива using не может использоваться в объявлении пространства имен.
  • CS8915: ошибка: глобальная директива using должна предшествовать всем неглобальным директивам using.
  • CS8954: ошибка: исходный файл может содержать только одно объявление пространства имен с областью действия файла.
  • CS8955: ошибка: исходный файл не может содержать как объявления пространства имен с областью файла, так и обычные объявления пространства имен.
  • CS8956: ошибка: пространство имен с областью действия файла должно предшествовать всем остальным элементам в файле.
  • CS9130: ошибка: псевдоним using не может быть типомref.
  • CS9131: ошибка: только псевдоним using может быть unsafe.
  • CS9132: ошибка: использование псевдонима не может быть ссылочным типом, допускающим значение NULL.
  • CS9133: ошибка: static модификатор должен предшествовать unsafe модификатору.
  • CS9162: тип недопустим для "using static". Можно использовать только класс, структуру, интерфейс, перечисление, делегат или пространство имен.
  • CS9348: единица компиляции не может напрямую содержать элементы, такие как поля, методы или свойства.

И следующие предупреждения компилятора:

  • CS0105: Предупреждение: директива using для пространства имен появилась ранее в этом пространстве имен.
  • CS0435: предупреждение: пространство имен "namespace" в "assembly" конфликтует с импортированным типом "type" в "assembly". Используется пространство имен, определенное в "assembly".
  • CS0436: предупреждение: тип "type" в "assembly" конфликтует с импортированным типом "type2" в "assembly". Используется тип, определенный в "assembly".
  • CS0437: Предупреждение: тип "type" в assembly2 конфликтует с импортированным пространством имен "namespace" в "assembly1". Использование типа, определенного в "assembly".
  • CS0440: Предупреждение. Определение псевдонима с именем global не рекомендуется, так как global:: всегда ссылается на глобальное пространство имен, а не псевдоним.
  • CS8019: сведения: ненужная директива using.
  • CS8020: Информация: неиспользуемый внешний псевдоним.
  • CS8933: Информация: директива using ранее уже была объявлена как global using.

Эти ошибки и предупреждения указывают на проблемы с директивами using, объявлениями в единицах компиляции и пространствах имён или на конфликты имён между типами и пространствами имён. В следующих разделах описаны эти ошибки и способы их исправления.

Директива Using

Следующие ошибки относятся к using директивам:

  • CS0105: директива using для 'namespace' появилась ранее в этом пространстве имен.
  • CS0430: Внешний псевдоним 'alias' не указан в параметре /reference.
  • CS0439: Объявление псевдонима extern должно предшествовать всем остальным элементам, определенным в пространстве имен.
  • CS1529: директива using должна предшествовать всем остальным элементам, определенным в пространстве имен, кроме объявлений псевдонимов extern.
  • CS1679: недопустимый псевдоним экстерна для '/reference'; "идентификатор" не является допустимым идентификатором.
  • CS1680: недопустимый параметр псевдонима ссылки: "alias=" - отсутствует имя файла.
  • CS1681: нельзя переопределить глобальный псевдоним экстерна.
  • CS1730: атрибуты сборки и модуля должны предшествовать всем другим элементам, определенным в файле, за исключением директив using и объявлений псевдонимов extern.
  • CS2034: параметр /reference, объявляющий экстерн-псевдоним, может иметь только одно имя файла. Чтобы указать несколько псевдонимов или имен файлов, используйте несколько параметров /reference.
  • CS7015: 'extern alias' недопустим в этом контексте.
  • CS8019: Ненужная директива using.
  • CS8020: Неиспользуемый псевдоним extern.
  • CS8933: директива using появилась ранее как глобальная директива using.

Ознакомьтесь с директивой using и ссылкой на язык псевдонима экстерна для правил, которые управляют этими диагностиками. Возможные исправления включают:

  • Переместите все using директивы в верхнюю часть файла или в начало объявления пространства имен. Язык C# требует, чтобы директивы using располагались перед другими элементами в пространстве имен (CS1529).
  • Переместите все extern alias объявления перед любыми using директивами. Этому языку требуются екстерн алиасы прежде всех других элементов, включая using директивы (CS0439, CS7015).
  • Переместите все атрибуты сборки и уровня модуля после клаузов using и объявлений extern alias, но перед объявлениями типов. Атрибуты должны соответствовать директивам, но предшествовать типам (CS1730).
  • Убедитесь, что каждое extern alias объявление в исходном коде имеет соответствующий псевдоним, определенный в опциях ссылок проекта. Компилятор не может разрешить псевдоним, который не был указан (CS0430).
  • Используйте отдельный /reference параметр для каждого экстерн-псевдонима, а не объединение нескольких псевдонимов в одном варианте. Компилятору требуется один псевдоним для каждого параметра ссылки (CS2034).
  • Убедитесь, что псевдоним в параметре /reference является допустимым идентификатором C#. Псевдоним должен соответствовать правилам именования идентификаторов (CS1679). Добавьте имя файла после знака = в опции ссылки на псевдоним. Компилятору необходимо знать, какая сборка ссылается на псевдоним (CS1680).
  • Не пытайтесь переопределить global экстерн-псевдоним. global — это предопределенный псевдоним, который ссылается на все ссылки без псевдонимов (CS1681).
  • Удалите повторяющиеся using директивы. Компилятор предупреждает, когда одно пространство имен импортируется несколько раз (CS0105, CS8019, CS8933).
  • Удалите неиспользуемые extern alias объявления. Компилятор выдает диагностику, когда экстерн-псевдоним объявлен, но никогда не используется в коде (CS8020).

Использование статической директивы

Следующие ошибки относятся к using static директивам:

  • CS0138: директива using для пространства имен может применяться только к пространствам имен; "type" — это тип, а не пространство имен.
  • CS7007: директива using static может применяться только к типам. Вместо этого рассмотрим директиву using namespace .
  • CS9133: static модификатор должен предшествовать unsafe модификатору.
  • CS9162: тип недопустим для "using static". Можно использовать только класс, структуру, интерфейс, перечисление, делегат или пространство имен.

См. справочник по языку статической директивы для правил, которые управляют этими диагностиками. Возможные исправления включают:

  • Добавьте модификатор static при импорте элементов типа напрямую, так как опущение static указывает компилятору, что вы импортируете пространство имен, а не тип (CS0138).
  • static Удалите модификатор при импорте пространства имен, так как using static его можно применять только к типам, а не к пространствам имен (CS7007). Убедитесь, что цель using static директивы — это класс, структура, интерфейс, перечисление или делегат, так как другие типы не являются допустимыми целевыми объектами для статических импортов (CS9162).
  • static Поместите модификатор перед unsafe модификатором при объединении обоих, так как язык требует модификаторов в определенном порядке (CS9133).

Глобальная директива using

Следующие ошибки относятся к global using директивам:

  • CS8914: глобальная директива using не может использоваться в объявлении пространства имен.
  • CS8915: директива глобального использования должна предшествовать всем директивам, отличным от глобального использования.

Ознакомьтесь с языковым справочником по директивам глобального использования для получения информации о правилах, которые управляют этими диагностическими процессами. Возможные исправления включают:

  • Переместите директивы global using вне любого объявления пространства имен в область видимости файла, так как глобальные директивы использования применяются ко всему проекту и не могут быть ограничены пространством имен (CS8914).
  • Поместите все global using директивы перед любыми не глобальными using директивами в файле, так как языку требуются глобальные директивы, которые предшествуют локальным директивам (CS8915).
  • Директива static global using не может ссылаться на локальный тип файла .

Пространство имен, ограниченное областью файла

Следующие ошибки связаны с пространствами имен с областью действия файла:

  • CS8954: исходный файл может содержать только одно объявление пространства имен с областью действия файла.
  • CS8955: исходный файл не может содержать как объявления пространства имен с областью файла, так и обычные объявления пространства имен.
  • CS8956: пространство имен с областью действия файла должно предшествовать всем остальным элементам в файле.

См. справочник по языку пространства имен с областью действия файла для правил, которые управляют этими диагностиками. Возможные исправления включают:

  • Используйте только одно пространство имен с областью действия файла в каждом файле, поскольку язык позволяет установить пространство имен для всех типов в файле (CS8954).
  • Выберите объявления пространства имен с областью действия файла или с областью видимости блока в одном файле, так как язык не позволяет смешивать оба стиля (CS8955).
  • Переместите объявление пространства имен, ограниченного файлом, перед объявлениями типов, так как пространство имен должно быть определено до объявлений типов (CS8956).

Квалификатор псевдонима

Следующие ошибки связаны с квалификатором псевдонима:

  • CS0431: Не удается использовать псевдоним "идентификатор" с ::, так как псевдоним ссылается на тип. Используйте . вместо этого.
  • CS0432: псевдоним "идентификатор" не найден.
  • CS0440: Не рекомендуется определять псевдоним с именем global, так как global:: всегда ссылается на глобальное пространство имен, а не на псевдоним.
  • CS0687: Квалификатор :: пространства имен всегда разрешается в тип или пространство имен, поэтому этот квалификатор здесь недопустим. Вместо этого рекомендуется использовать ..
  • CS7000: Неожиданное использование имени с псевдонимом.
  • CS8083: Имя, уточненное псевдонимом, не является выражением.

Ознакомьтесь со справочником по квалификатору пространства имен, чтобы узнать правила, управляющие этими диагностическими средствами. Возможные исправления включают:

  • Замените оператор оператором ::. при доступе к членам псевдонима типа, так как :: квалификатор действителен только для псевдонимов пространства имен, а не псевдонимов типов (CS0431, CS0687).
  • Убедитесь, что псевдоним, на который вы ссылаетесь, объявлен с помощью директивы using или extern alias, так как компилятор не может разрешить неопределенный псевдоним (CS0432).
  • Используйте квалификатор псевдонима только в контекстах, где ожидается имя типа или пространства имен, так как имена псевдонимов недопустимы в качестве выражений (CS7000, CS8083).
  • Выберите другое имя псевдонима вместо globalэтого, так как global зарезервировано для ссылки на глобальное пространство имен и не может быть переопределено (CS0440).

Использование ограничений псевдонима

Следующие ошибки связаны с ограничениями на использование псевдонимов:

  • CS0576: пространство имен "namespace" содержит определение, конфликтующее с псевдонимом "identifier".
  • CS1537: Псевдоним using "alias" ранее уже встречался в этом пространстве имен.
  • CS7016: Псевдоним "alias" конфликтует с определением вида символа
  • CS8085: директива using static не может использоваться для объявления псевдонима.
  • CS9130: Псевдоним using не может быть типом ref.
  • CS9131: Только псевдоним using может быть unsafe.
  • CS9132: использование псевдонима не может быть nullable ссылочным типом.

Ознакомьтесь со справочником по языку использование псевдонима для правил, которые регулируют эти диагностики. Возможные исправления включают:

  • Выберите уникальное имя псевдонима, которое не конфликтует с существующими именами типов или пространств имен в данной области видимости, так как компилятор не может различать псевдоним и существующее определение (CS0576).
  • Используйте каждое имя псевдонима только один раз в пространстве имен, так как повторяющиеся объявления псевдонимов создают неоднозначность (CS1537).
  • В скрипте или коде отправки переименуйте псевдоним или конфликтующий член отправки, чтобы их имена были уникальными (CS7016). Диагностика определяет тип элемента, например field или type.
  • static Удалите модификатор при объявлении псевдонима, так как псевдонимы и статические импорты являются взаимоисключающими — используются либо using static для импорта элементов, using Alias = либо для создания псевдонима, но не одновременно (CS8085).

Следующие ограничения применяются к использованию псевдонимов:

  • Не используйте модификаторы ref, in или out в псевдониме, так как эти модификаторы параметров недопустимы в контекстах использования псевдонима типа (CS9130).
  • Используйте модификатор unsafe только с псевдонимами, которые ссылаются на типы указателей, или с директивами using static, так как unsafe без псевдонима или статического импорта не допускается (CS9131).
  • Используйте ненулевой ссылочный тип при создании псевдонима для ссылочного типа, так как типы ссылок, допускающие значение NULL, не могут быть псевдонимами напрямую (CS9132).

Объявления единицы компиляции и пространства имен

Следующие ошибки связаны с объявлениями в единицах компиляции и пространствах имен:

  • CS0116: пространство имен не может непосредственно содержать элементы, такие как поля, методы или инструкции.
  • CS1022: Ожидается определение типа или пространства имен либо конец файла.
  • CS1527: Элементы, определенные в пространстве имен, не могут быть явно объявлены с модификаторами доступа private, protected, protected internal или private protected.
  • CS1671: объявление пространства имен не может иметь модификаторы или атрибуты.
  • CS7021: не удается объявить пространство имен в коде скрипта.
  • CS9348: единица компиляции не может напрямую содержать элементы, такие как поля, методы или свойства.

Ознакомьтесь с ключевым словом пространства имен и общей структурой языка программы C# , чтобы узнать о правилах, которые управляют этими диагностиками. Возможные исправления включают:

  • Убедитесь, что все методы, поля и свойства объявляются внутри типа (класс, структура, запись или интерфейс), а не непосредственно внутри пространства имен, так как пространства имен могут содержать только объявления типов, вложенные пространства имен и using директивы (CS0116).
  • Перемещение полей, свойств, событий, индексаторов, операторов и методов-членов в класс, структуру, запись или интерфейс (CS9348). На уровне единицы компиляции исполняемый код может представлять собой инструкцию верхнего уровня в глобальном пространстве имён, а объявление в форме метода — локальную функцию, а не метод-член.
  • Проверьте несоответствие фигурных скобок в исходном файле, так как дополнительная закрывающая скобка после определения пространства имен или типа приводит к ошибке, когда компилятор обнаруживает неожиданное содержимое в конце файла (CS1022).
  • Измените уровень доступа типа, объявленного в пространстве имён, на public или internal, либо не указывайте модификатор доступа, чтобы использовать уровень доступа по умолчанию internal (CS1527). Типы, объявленные без явного пространства имен, являются членами глобального пространства имен, поэтому то же ограничение применяется.
  • Удалите любые модификаторы доступа или атрибуты из объявлений пространства имен, так как пространства имен не поддерживают модификаторы, такие как public или private, а атрибуты не могут применяться к ним (CS1671).
  • Переместите объявления пространств имен из файлов скриптов C# (.csx) в обычные исходные файлы (.cs), поскольку код скрипта выполняется в едином контексте выполнения, который не поддерживает объявления пространств имен (CS7021).

Конфликты именования пространства имен и типов

Следующие ошибки и предупреждения связаны с конфликтами именования между пространствами имен и типами:

  • CS0101: пространство имен 'namespace' уже содержит определение для 'identifier'
  • CS0104: 'reference' является неоднозначной ссылкой на имя между 'identifier' и 'identifier'.
  • CS0434: пространство имен NamespaceName1 в NamespaceName2 конфликтует с типом TypeName1 в NamespaceName3.
  • CS0435: пространство имен "пространство имен" в "сборке" конфликтует с импортированным типом "тип" в "сборке". Используется пространство имен, определенное в "сборке".
  • CS0436: Тип "type" в "assembly" конфликтует с импортированным типом "type2" в "assembly". Используется тип, определенный в "assembly".
  • CS0437: тип "type" в assembly2 конфликтует с импортированным пространством имен "namespace" в "assembly1". Используется тип, определенный в "assembly".
  • CS0438: тип "type" в "module_1" конфликтует с пространством имен "namespace" в "module_2".

Ознакомьтесь с директивой using, внешним псевдонимом и квалификатором псевдонима пространства имен для правил, которые управляют этими диагностиками. Возможные исправления включают:

  • Используйте полное имя или псевдоним пространства имен , если код ссылается на имя, которое существует в нескольких импортированных пространствах имен.
  • Компилятор не может определить, какой тип вы планируете использовать, если одно и то же имя отображается в двух или нескольких пространствах имен, импортированных using директивами (CS0104).
  • Переименуйте или удалите повторяющийся член пространства имен (CS0101). Пространство имен и тип также не могут иметь одинаковое полное имя, поэтому переименуйте объявление, если имя типа конфликтует с вложенным именем пространства имен.
  • Переименуйте тип или пространство имен, если импортированный тип и импортированное вложенное пространство имен имеют одинаковое полное имя. Компилятор не может различать их при ссылке на имя (CS0434, CS0438).

Чтобы устранить предупреждения о конфликте именования, переименуйте одно из конфликтующих объявлений, используйте другое пространство имен, удалите ненужную ссылку на сборку или используйте экстерн-псевдоним для диамбигуации между двумя определениями. Компилятор автоматически разрешает эти конфликты — используя локально определенное пространство имен по импортированному типу (CS0435), локально определенному типу импортированного типа (CS0436) или локально определенному типу по импортированному пространству имен (CS0437), но предупреждения указывают на потенциальный источник путаницы, который следует устранить.

Импорт предопределенного типа

Следующая ошибка связана с отсутствующими предопределенными определениями типов:

  • CS0518: предопределенный тип "type" не определен или импортирован.

Замечание

Это предупреждение сообщается только во время явных операций сборки или перестроения . Он не отображается во время ввода в интегрированной среде разработки в рамках диагностики IntelliSense. Это означает, что если вы исправите предупреждение с помощью поля или удалите его, предупреждение может сохраняться в списке ошибок, пока не создадите или перестроите проект еще раз.

См. справочник по параметрам компилятора NoStandardLib для правил, которые управляют этой диагностикой.

Убедитесь, что проект предназначен для правильной среды выполнения .NET. Стандартные типы, такие как System.Int32 и System.String, происходят из библиотеки среды выполнения. Неправильная или недостающая <TargetFramework> спецификация не позволяет компилятору находить эти типы (CS0518). Убедитесь, что свойство <TargetFramework> в файле .csproj указывает предназначенную среду выполнения (например, net10.0). Не указывайте параметр компилятора NoStandardLib , если вы не планируете определять собственное System пространство имен. Этот параметр предотвращает импорт стандартной библиотеки, которая определяет все предопределенные типы (CS0518). Если ошибка сохраняется, попробуйте перезагрузить проект в Visual Studio, удалить obj папки и bin перестроить проект или переустановить среду выполнения .NET (CS0518).