Поделиться через


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

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

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

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

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

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

Директива Using

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

  • CS0105: директива using для пространства имен появилась ранее в этом пространстве имен.
  • CS0430: внешний псевдоним 'alias' не указан в параметре /reference.
  • CS0439: Объявление extern-псевдонима должно предшествовать всем остальным элементам, определённым в пространстве имён.
  • CS1529: предложение using должно предшествовать всем остальным элементам, определенным в пространстве имен, кроме объявлений экстерна псевдонимов.
  • CS1679: недопустимый псевдоним экстерна для '/reference'; "идентификатор" не является допустимым идентификатором.
  • CS1680: недопустимый параметр псевдонима ссылки: "alias=" - отсутствует имя файла.
  • CS1681: нельзя переопределить глобальный псевдоним экстерна.
  • CS1730: атрибуты сборки и модуля должны предшествовать всем остальным элементам, определенным в файле, за исключением предложений и объявлений экстерна псевдонимов.
  • CS2034: параметр /reference, объявляющий экстерн-псевдоним, может иметь только одно имя файла. Чтобы указать несколько псевдонимов или имен файлов, используйте несколько параметров /reference.
  • CS7015: 'extern alias' недопустим в данном контексте.
  • CS8019: ненужная директива using.
  • CS8020: Неиспользуемый внешний псевдоним.
  • CS8933: директива 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' содержит определение, конфликтующее с псевдонимом 'идентификатор'.
  • CS1537: Псевдоним "alias" ранее использовался как алиас в этом пространстве имен.
  • CS8085: директива using static не может использоваться для объявления псевдонима.
  • CS9130: использование псевдонима не может быть типом ref .
  • CS9131: Только псевдоним 'using' может быть unsafe.
  • CS9132: использование псевдонима не может быть типом ссылок, допускающих значение NULL.

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

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

Начиная с C# 12, следующие ограничения применяются к использованию псевдонимов:

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

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

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

  • CS0116: пространство имен не может напрямую содержать элементы, такие как поля, методы или операторы.
  • CS1022: определение типа или пространства имен или ожидаемое завершение файла.
  • CS1671: объявление пространства имен не может иметь модификаторы или атрибуты.
  • CS7021: не удается объявить пространство имен в коде скрипта.

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

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

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

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

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

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

  • Используйте полное имя или псевдоним пространства имен , если код ссылается на имя, которое существует в нескольких импортированных пространствах имен.
  • Компилятор не может определить, какой тип вы планируете использовать, если одно и то же имя отображается в двух или нескольких пространствах имен, импортированных using директивами (CS0104).
  • Переименуйте тип или пространство имен, если импортированный тип и импортированное вложенное пространство имен имеют одинаковое полное имя. Компилятор не может различать их при ссылке на имя (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).