Устранение предупреждений, связанных с использованием пространств имен
В этой статье рассматриваются следующие ошибки компилятора:
- CS0138: ошибка: директива пространства имен с использованием может применяться только к пространствам имен; "type" — это тип, а не пространство имен.
- CS0431: ошибка: не удается использовать псевдоним "идентификатор",
::
так как псевдоним ссылается на тип. Используйте.
вместо этого. - CS0432: ошибка: псевдоним "идентификатор" не найден.
- CS0576: ошибка: пространство имен "пространство имен" содержит определение, конфликтующее с псевдонимом "идентификатор".
- CS0687: ошибка: квалификатор
::
пространства имен всегда разрешается в тип или пространство имен, поэтому здесь запрещено. Вместо этого рекомендуется использовать.
. - CS1529: ошибка: предложение using должно предшествовать всем другим элементам, определенным в пространстве имен, кроме объявлений экстерна псевдонима.
- CS1537: ошибка: в этом пространстве имен появился псевдоним с использованием псевдонима.
- CS7000: ошибка: неожиданное использование псевдонима.
- CS7007: ошибка: директива
using static
может применяться только к типам. Вместо этого рассмотрим директивуusing namespace
- CS8083: ошибка: полное имя псевдонима не является выражением.
- CS8085: ошибка: директива using static не может использоваться для объявления псевдонима.
- CS8914: ошибка: глобальная директива using не может использоваться в объявлении пространства имен.
- CS8915: ошибка: глобальная директива using должна предшествовать всем директивам, отличным от глобального использования.
- CS9055: ошибка: локальный тип файла нельзя использовать в директиве global using static.
- CS9130: ошибка: использование псевдонима не может быть типом
ref
. - CS9131: ошибка: может быть
unsafe
только псевдоним с использованием. - CS9132: ошибка: использование псевдонима не может быть ссылочным типом, допускаемым значением NULL.
- CS9133: ошибка:
static
модификатор должен предшествоватьunsafe
модификатору. - CS9162: тип недопустим для "using static". Можно использовать только класс, структуру, интерфейс, перечисление, делегат или пространство имен.
И следующие предупреждения компилятора:
- CS0105: Предупреждение: директива using для пространства имен появилась ранее в этом пространстве имен.
- CS0440: Предупреждение. Определение псевдонима с именем
global
не рекомендуется, так какglobal::
всегда ссылается на глобальное пространство имен, а не псевдоним. - CS8019: сведения: ненужная директива using.
- CS8933: Информация: директива using появилась ранее в качестве глобального использования.
Эти ошибки и предупреждения указывают, using
что директива не сформирована правильно. В следующих разделах рассматриваются эти ошибки и способы их исправления.
Директива Using
Директива using
должна предшествовать любым другим элементам в namespace
объявлении или перед любыми namespace
объявлениями в файле. Установка using
директивы позже в файле приводит компилятору к возникновению ошибки CS1529:
namespace UsingDirective;
public class MyClass
{
}
using System.Text.Json; // CS1529
Чтобы устранить эту проблему, переместите все using
объявления в верхнюю часть файла или в верхней части пространства имен:
using System.Text.Json;
namespace UsingDirective;
public class MyClass
{
}
Компилятор выдает предупреждение CS8933, CS0105 или диагностики CS8019 для повторяющихся using
директив из using
или global using
директивы. Можно удалить любые дубликаты.
Неправильное объединение using
директивы с unsafe
static
global
модификаторами или модификаторами using
директивы рассматривается далее в этой статье.
Использование статической директивы
Директива using static
импортирует члены одного типа в текущее пространство имен. В следующем примере методы импортируются из System.Console
, например WriteLine
, в текущее пространство имен:
using static System.Console;
Компилятор создает CS0138 , если не указан static
модификатор:
using System.Console; // CS0138
Компилятор создает CS7007 , если включить static
модификатор импорта пространства имен вместо типа:
using static System; // CS7007
Компилятор выдает CS9162, если символ не является одним из соответствующих типов.
При объединении static
модификатора с unsafe
модификатором using
в директиве static
модификатор должен быть первым:
using static unsafe UnsafeExamples.UnsafeType;
Глобальная директива using
Директива global using
импортирует пространство имен или тип во всех исходных файлах в текущем проекте:
global using System.Text;
Любые global using
директивы должны предшествовать любым не глобальным using
директивам в этом исходном файле и не должны быть помещены в файл namespace
. Это приводит к тому, что CS8915 и CS8914 соответственно.
Кроме того, директива static global using
не может ссылаться на локальный тип файла.
Квалификатор псевдонима
Квалификатор псевдонима, ::
предшествует псевдониму пространства имен или следует псевдониму global
. Если вы используете, где .
следует использовать для разделения элементов полного имени, компилятор выдает один из CS0431, CS0432, CS0687, *CS7000 или CS8083.::
Во всех случаях замените ::
.
разделитель.
Кроме того, при определении псевдонима с именем global
компилятор выдает CS0440. Псевдоним global
всегда ссылается на глобальное пространство имен. Объявление псевдонима для него не работает, и вы должны выбрать другое имя для псевдонима.
Конфликты имен псевдонимов
Псевдоним можно объявить в пространстве имен или типе using
с помощью директивы:
using JSON = System.Text.Json;
using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
using TimedData = (System.DateTime timeRecorded, decimal value);
Необходимо попытаться создать уникальное имя псевдонима, имя слева =
от входа в предыдущих примерах. Использование имени, которое уже сопоставляется с типом (например Object
) или пространством имен (System
) может вызвать CS0576 или CS1537.
Ограничения на использование псевдонимов
До C# 12 язык ввел эти ограничения на using
директивы, создающие псевдоним для объявления типа:
Невозможно создать псевдоним с директивой
using static
:using static con = System.Console; using static unsafe ip = int*;
Начиная с C# 12, вводятся следующие ограничения:
Нельзя использовать
in
ref
модификаторы илиout
модификаторы в псевдониме:// All these are invalid using RefInt = ref int; using OutInt = out int; using InInt = in int;
Директива
unsafe using
должна указывать псевдоним или :static using
// Elsewhere: public namespace UnsafeExamples { public unsafe static class UnsafeType { // ... } } // Using directives: using unsafe IntPointer = int*; using static unsafe UnsafeExamples.UnsafeType; using unsafe UnsafeExamples; // not allowed
Нельзя создать псевдоним для типа ссылок, допускающего значение NULL:
using NullableInt = System.Int32?; // Allowed using NullableString = System.String?; // Not allowed