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

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

  • CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: Компонент недоступен. Используйте более новую языковую версию.
  • CS8058: функция экспериментальна.
  • CS8192: указанная версия языка не поддерживается или недопустимая
  • CS8303: указанная языковая версия не может иметь начальные нули
  • CS8304: версия компилятора меньше языковой версии
  • CS1738: спецификации именованных аргументов должны отображаться после указания всех фиксированных аргументов.
  • CS8306: имя элемента Кортежа выводится.
  • CS8314: выражение типа не может обрабатываться шаблоном типа
  • CS8371: атрибуты, предназначенные для полей в свойствах автозапуска, не поддерживаются в языковой версии.
  • CS8401: чтобы использовать @$ вместо $@ интерполированной строки подробной версии, используйте более новую языковую версию.
  • CS8511: выражение типа не может обрабатываться шаблоном типа.
  • CS8627: параметр типа, допускающего значение null, должен быть известен как тип значения или ссылочный тип, не допускающий значения NULL.
  • CS8630: недопустимые параметры, допускающие значение NULL. Использование более новой языковой версии
  • CS8652: модификатор недействителен для этого элемента.
  • CS8704: тип не реализует член интерфейса. Он неявно не может реализовать неявно открытый член.
  • CS8706: тип не может реализовать член интерфейса, так как компонент недоступен в этой версии.
  • CS8904: недопустимая дисперсия: параметр типа должен быть допустимым.
  • CS8912: наследование записи с запечатанным объектом Object.ToString не поддерживается.
  • CS8919: не удается реализовать указанный член интерфейса в типе, так как целевая среда выполнения не поддерживает статические абстрактные члены в интерфейсах
  • CS8929: метод не может реализовать член интерфейса в типе, так как целевая среда выполнения не поддерживает статические абстрактные члены в интерфейсах.
  • CS8957: условное выражение недопустимо в языковой версии, так как общий тип не найден между типами.
  • CS8967: новые строки внутри интерполированной строки, отличной от детализации, не поддерживаются в C#
  • CS9014: ошибка: использование возможно неназначенных свойств. Обновите свойство до автоматического использования по умолчанию.
  • CS9015: ошибка: использование возможно неназначенных полей. Обновление до автоматического обновления поля.
  • CS9016: предупреждение: использование, возможно, неназначенных свойств. Обновите свойство до автоматического использования по умолчанию.
  • CS9017: предупреждение: использование, возможно, неназначенных полей. Обновление до автоматического обновления поля.
  • CS9064: целевая среда выполнения не поддерживает поля ссылок.
  • CS9103: определение в модуле с нераспознанной версией Ref Сейф tyRulesAttribute, ожидающей "11".
  • CS9171: целевая среда выполнения не поддерживает встроенные типы массивов.
  • CS9194: аргумент может не передаваться с ref помощью ключевое слово. Чтобы передать ref аргументы in в параметры, обновите язык версии 12 или более поздней.
  • CS9202: функция недоступна в C# 12.0. Используйте более новую языковую версию
  • CS9211: аргумент diagnosticId атрибута "Экспериментальный" должен быть допустимым идентификатором.

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

  • CS0171, CS8881: поле резервного копирования для автоматического реализации свойства "name" должно быть полностью назначено перед возвратом элемента управления вызывающему объекту.
  • CS0188, CS8885: объект "этот" нельзя использовать до назначения всем его полям
  • CS0843, CS8880: поле резервного копирования для автоматического реализации свойства "name" должно быть полностью назначено перед возвратом элемента управления вызывающему объекту.
  • CS8305: компонент предназначен только для оценки и подлежит изменению или удалению в будущих обновлениях.
  • CS9204: тип предназначен только для оценки и подлежит изменению или удалению в будущих обновлениях. Отключайте эту диагностику, чтобы продолжить.

Причина всех этих ошибок и предупреждений заключается в том, что компилятор, установленный, поддерживает более новую версию C#, чем выбранная версия проекта. Компилятор C# может соответствовать любой предыдущей версии. Синтаксис можно проверить на более ранней версии C#или потому, что проект должен поддерживать старые библиотеки или среды выполнения.

Существует две возможные причины и три способа устранения этих ошибок и предупреждений.

Обновление целевой платформы

Компилятор определяет значение по умолчанию на основе следующих правил:

Назначение Версия Версия языка C# по умолчанию
.NET 8.x C# 12
.NET 7.x C# 11
.NET 6.x C# 10
.NET 5.x C# 9.0
.NET Core 3.x C# 8.0
.NET Core 2.x C# 7.3
.NET Standard 2.1 C# 8.0
.NET Standard 2.0 C# 7.3
.NET Standard 1.x C# 7.3
.NET Framework all C# 7.3

Если выбранная платформа не соответствует требуемой языковой версии, можно обновить целевую платформу.

Выберите соответствующую версию языка

В файле проекта может быть выбрана более старая целевая платформа. При удалении LangVersion элемента из файла проекта компилятор использует значение по умолчанию, указанное в предыдущем разделе. В следующей таблице показаны все текущие версии языка C#. Вы также можете указать определенную языковую версию, чтобы включить новые функции.

Значение Значение
preview Компилятор допускает использование любого допустимого синтаксиса языка из последней предварительной версии.
latest Компилятор принимает синтаксис из последней выпущенной версии компилятора (включая дополнительный номер версии).
latestMajor
или default
Компилятор принимает синтаксис из последней основной версии компилятора.
12.0 Компилятор принимает только синтаксис, включенный в C# 12 или ниже.
11.0 Компилятор принимает только синтаксис, включенный в C# 11 или ниже.
10.0 Компилятор принимает только синтаксис, включенный в спецификацию C# 10 или более ранних версий.
9.0 Компилятор принимает только синтаксис, включенный в спецификацию C# 9 или более ранних версий.
8.0 Компилятор принимает только синтаксис, включенный в спецификацию C# 8.0 или более ранней версии.
7.3 Компилятор принимает только синтаксис, включенный в спецификацию C# 7.3 или более ранней версии.
7.2 Компилятор принимает только синтаксис, включенный в спецификацию C# 7.2 или более ранней версии.
7.1 Компилятор принимает только синтаксис, включенный в спецификацию C# 7.1 или более ранней версии.
7 Компилятор принимает только синтаксис, включенный в спецификацию C# 7.0 или более ранней версии.
6 Компилятор принимает только синтаксис, включенный в спецификацию C# 6.0 или более ранней версии.
5 Компилятор принимает только синтаксис, включенный в спецификацию C# 5.0 или более ранней версии.
4 Компилятор принимает только синтаксис, включенный в спецификацию C# 4.0 или более ранней версии.
3 Компилятор принимает только синтаксис, включенный в спецификацию C# 3.0 или более ранней версии.
ISO-2
или 2
Компилятор принимает только синтаксис, включенный в спецификацию ISO/IEC 23270:2006 C# (2.0).
ISO-1
или 1
Компилятор принимает только синтаксис, включенный в спецификацию ISO/IEC 23270:2003 C# (1.0/1.2).

Дополнительные сведения о версиях языка, поддерживаемых для каждой версии платформы, см. в статье " Настройка языковой версии " в разделе справочника по языку.

Избегайте обновленной функции

Если необходимо поддерживать старые библиотеки или среды выполнения, может потребоваться избежать использования новых функций.

Включение экспериментальных функций

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

Предупреждение

Экспериментальные функции подвержены изменениям. API могут измениться или удалить их в будущих обновлениях. Включение экспериментальных функций — это способ получения отзывов авторов библиотек о идеях и концепциях для будущего развития. Используйте крайнюю осторожность при использовании любой функции, помеченной как экспериментальная.

Вы также можете объявить собственные экспериментальные функции с помощью System.Diagnostics.CodeAnalysis.ExperimentalAttribute. Компилятор выдает CS9211, если идентификатор, используемый для экспериментальной функции, не является допустимым идентификатором.

Критические изменения при инициализации структуры

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

  • CS0171, CS8881: поле резервного копирования для автоматического реализации свойства "name" должно быть полностью назначено перед возвратом элемента управления вызывающему объекту.
  • CS0188, CS8885: объект "этот" нельзя использовать до назначения всем его полям
  • CS0843, CS8880: поле резервного копирования для автоматического реализации свойства "name" должно быть полностью назначено перед возвратом элемента управления вызывающему объекту.

Эту ошибку можно устранить, обновив версию языка до C# 11, каждый struct конструктор инициализирует все поля. Если это не возможно, необходимо явно вызвать конструктор по умолчанию, как показано в следующем примере:

struct S
{
    public int AIProp { get; set; }
    public S(int i){} //CS0843
    // Try the following lines instead.
    // public S(int i) : this()
    // {
    //     AIProp = i;
    // }
}

class Test
{
    static int Main()
    {
        return 1;
    }
}