Функция «использование объявлений» недоступна в C # 7.3. Пожалуйста, используйте языковую версию 8.0 или выше - ошибка на одном компьютере, но работает на другом


24

При использовании Visual Studio Enterprise 16.3.7на двух отдельных машинах один строит нормально, а другой выдает ошибку:

Функция «использование объявлений» недоступна в C # 7.3. Пожалуйста, используйте языковую версию 8.0 или выше.

введите описание изображения здесь

введите описание изображения здесь

Это может быть легко решена на рабочей машине ни один, установив LangVersionв .csprojкачестве предлагаемых здесь https://stackoverflow.com/a/48085575/3850405 или пусть Visual Studio автоматически исправить это как экран печати выше.

<LangVersion>8.0</LangVersion>

Что я не могу понять, так это то, почему одна машина прекрасно работает без этой строки, .csprojа другая нуждается в ней?


Если вы получаете такую ​​ошибку, это означает, что это не проект C # 8, или вы используете версию Resharper с ошибкой анализа
— Panagiotis Kanavos

Что такое TargetFramework и LangVersion в вашем csproj?
— Панагиотис Канавос

@PanagiotisKanavos Да, но проект основан на одной машине, а не на другой - это то, что я не понимаю. ReSharper не используется.
— Ogglas

Это может означать, что 3.0 SDK отсутствует на одной машине. Что dotnet --list-sdksпоказывает?
— Панагиотис Канавос

@PanagiotisKanavos Целевая структура .NET Framework 4.6.1и LangVersionне установлена.
— Ogglas

Ответы:


20

Я получил ту же ошибку, но я просто забыл включить

<LangVersion>8.0</LangVersion>

атрибут во всех файлах .csproj в решении. Ниже приведены мои текущие настройки C # 8:

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    <NullableContextOptions>enable</NullableContextOptions>
  </PropertyGroup>

Я нашел следующие документы наиболее полезными при переходе с ядра 2.2 на 3.x:

MSDN 2.2 -> 3.0

MSDN 3.0 -> 3.1


2
Вы можете использовать <LangVersion>latest</LangVersion>вместо<LangVersion>8.0</LangVersion>
— Элиаху Аарона

1
Я думаю, что первая ссылка MSDN 2.2 -> 3.0предназначена для ссылки на следующее: docs.microsoft.com/en-us/aspnet/core/migration/22-to-30 Я попытался отредактировать ответ, чтобы изменить его, но «предложил редактировать очередь полон ", поэтому будет публиковать здесь вместо.
— ahillier88


11

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

Чтобы переопределить язык C # по умолчанию, добавьте в файл проекта (как предложено в вопросе):

<PropertyGroup>
   <LangVersion>8.0</LangVersion>
</PropertyGroup>

или:

<PropertyGroup>
   <LangVersion>latest</LangVersion>
</PropertyGroup>

См. Версии языка C # для версий языка C # по умолчанию для различных целевых структур и как вручную выбрать версию языка C #.

См. Также ответ о переполнении стека. Поддерживает ли C # 8 .NET Framework? для получения дополнительной информации по этой теме.


Вот часть статьи о версии языка C # :

Управление версиями на языке C #

Последний компилятор C # определяет версию языка по умолчанию на основе целевой платформы или структур вашего проекта. Это связано с тем, что язык C # может иметь функции, основанные на типах или компонентах среды выполнения, которые недоступны в каждой реализации .NET. Это также гарантирует, что для любой цели, против которой построен ваш проект, вы получите версию наивысшей совместимости по умолчанию.

Правила в этой статье применяются к компилятору, поставляемому с Visual Studio 2019 или .NET Core 3.0 SDK. Компиляторы C #, которые являются частью установки Visual Studio 2017 или более ранних версий .NET Core SDK, по умолчанию предназначены для C # 7.0.

Значения по умолчанию

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

--------------------------------------------------------
Target framework | version | C# language version default
--------------------------------------------------------
.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
--------------------------------------------------------

Переопределить значение по умолчанию

Если вам необходимо явно указать версию C #, вы можете сделать это несколькими способами:

  • Отредактируйте файл проекта вручную.
  • Установите языковую версию для нескольких проектов в подкаталоге.
  • Настройте параметр компилятора -langversion.

Редактировать файл проекта

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

<PropertyGroup>
   <LangVersion>preview</LangVersion>
</PropertyGroup>

Значение previewиспользует последнюю доступную предварительную версию языка C #, которую поддерживает ваш компилятор.

Настроить несколько проектов

Чтобы настроить несколько проектов, вы можете создать файл Directory.Build.props , содержащий <LangVersion>элемент. Вы обычно делаете это в своем каталоге решений. Добавьте следующее в файл Directory.Build.props в каталоге вашего решения:

<Project>
 <PropertyGroup>
   <LangVersion>preview</LangVersion>
 </PropertyGroup>
</Project>

Теперь сборки в каждом подкаталоге каталога, содержащего этот файл, будут использовать предварительную версию C #. Для получения дополнительной информации см. Статью « Настройка сборки» .


8

Я скачал последнюю версию .Net Core 3.0 и 3.1 и имел ту же проблему. Мне показалось, что исправление загружает последнее обновление для Visual Studio 2019 (до версии 16.4.2).

Это также перезагрузило мой компьютер, и ошибка ушла.


Это не номер версии VS2019, они выглядят как 16.xy Используйте Справка> О программе.
— Ганс

4.7.03056 - это версия .NET Framework, последняя версия VS в настоящее время - 16.4.4
— Алекс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.