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

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

  • 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 директивы с unsafestaticglobalмодификаторами или модификаторами 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, вводятся следующие ограничения:

  • Нельзя использовать inrefмодификаторы или 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