Функция «использование объявлений» недоступна в 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а другая нуждается в ней?

Ogglas
источник
Если вы получаете такую ​​ошибку, это означает, что это не проект 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
Алекс