С выходом C# 7, компания Microsoft изменила подход к выпуску новых версий языка: стали доступны минорные версии, которые понемногу расширяют его возможности. Использовать их или ждать выхода следующей мажорной версии – решать самим разработчикам. Поэтому по умолчанию поддержка промежуточных версий выключена.
Visual Studio 2019.3 (версия 16.3)
С 3 обновлением Visual Studio 2019 стала доступна 8 версия языка C#, которая требует поддержку со стороны платформы. Поэтому Visual Studio 2019 стала автоматически выставлять доступную версию языка в зависимости от выбранной в качестве цели платформы.
- .NET Framework (все версии) – C# 7.3
- .NET Standard 2.0 и предыдущие – C# 7.3
- .NET Standard 2.1 – C# 8
- .NET Core 2.x и предыдущие – C# 7.3
- .NET Core 3.x – C# 8
- .NET 5 и новее – C# 9
При этом выбор версии языка в диалоге Advanced Build Setting отключен и дополнен поясняющим сообщением:
Единственный способ изменить версию языка – самостоятельно установить её в настройках проекта. Для этого необходимо вручную отредактировать соответствующий файл .csproj, добавив в него или изменить значение следующего свойства:
<PropertyGroup> <LangVersion> версия языка </LangVersion> </PropertyGroup>
Расположение этого свойства зависит файла проектка, который, в свою очередь, зависит от платформы на которую нацелен проект. Рассмотрим на примере установки 9 версии языка:
- .NET Core / .NET Standard / .NET 5 и новее
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.1</TargetFramework> <LangVersion>9.0</LangVersion> </PropertyGroup> </Project>
- .NET 4.8 и старше
<?xml version="1.0" encoding="utf-8"?> ... <PropertyGroup> ... <TargetFrameworkVersion>v4.8</TargetFrameworkVersion> <LangVersion>9.0</LangVersion> ... </PropertyGroup> ... <Import Project="$(MSBuildToolsPath)Microsoft.CSharp.targets" /> </Project>
В качестве номера версии можно использовать следующие значения:
- номер необходимой версии языка в формате Major.Minor. Например: 9.0 – настраивает проект на использование указанной версии языка.
- default – разрешает использовать последнюю доступную для платформы проекта мажорную версию.
- latest – позволит использовать все новые минорные и мажорные версии, которые станут доступны для платформы проекта автоматически по мере их выхода.
Что лучше выбрать? То что больше подходит каждому разработчику или команде в зависимости от предпочтений и условий работы.
Обратите внимание, что Visual Studio создает свой вариант свойства для каждой конфигурации в.NET Framework проектах. Если оно уже было когда-то изменено через интерфейс Visual Studio, то в файле проекта будут несколько записей вида:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> <LangVersion>7.0</LangVersion> </PropertyGroup>
Visual Studio 2019 до 3 обновления и Visual Studio 2017
Для использования минорных версий языка c Visual Studio 2017 необходимо обновить ее до версии 15.3 (Update 3) или выше. После этого появится возможность установить какая версия языка будет использоваться в проекте.
Необходимо отметить, что данная настройка находится на уровне проектов. Поэтому если в решении (solution) больше одного проекта, то каждый из них настраивается индивидуально. При этом решение может содержать проекты с различными настройками версии языка.
Свойства проекта
Чтобы открыть диалог с настройкой доступных версий, необходимо в свойствах проекта на закладке “Build” нажать на кнопку «Advanced…».
Файл проекта .csproj
Аналогично описанию для Visual Studio 2019.3.
Код на новой версии языка
Последний вариант – просто написать код, который использует возможности новой версии. При этом Visual Studio сама предложит установить эту версию или вариант latest в качестве версии языка для проекта.
Добавлено 27 марта 2021 в 18:12
Поскольку доступно множество различных версий C++ (C++98, C++03, C++11, C++14, C++17 и т. д.), как ваш компилятор узнает, какую из них использовать? Как правило, компилятор выбирает стандарт по умолчанию (часто не самый последний стандарт языка). Если вы хотите использовать другой стандарт, вам необходимо изменить настройки вашей IDE/компилятора. Эти настройки применяются только к активному проекту. При создании нового проекта их необходимо установить заново.
Мы используем C++17. Если ваш компилятор не поддерживает C++17, вы не сможете полностью пройти все уроки, хотя с большинством из них у вас не будет проблем. Убедитесь, что вы используете последнюю версию компилятора, чтобы вы могли самостоятельно скомпилировать все примеры. В конце этого урока есть пример, который вы можете использовать, чтобы проверить, правильно ли вы настроили компилятор.
Кодовые названия для разрабатываемых стандартов языка C++
Обратите внимание, что стандарты языка C++ названы по годам, в которые они были приняты (например, C++ 17 был завершен в 2017 году).
Однако, когда идет согласование нового языкового стандарта, неясно, в каком году состоится его окончательная доработка. Следовательно, незавершенным языковым стандартам присваиваются кодовые названия, которые затем, после завершения стандарта, заменяются фактическими названиями. Например, C++11 во время разработки назывался c++1x. Вы по-прежнему можете встречать эти кодовые названия (особенно для будущей версии языкового стандарта, у которой еще нет окончательного названия).
Вот сопоставление кодовых названий с конечными названиями:
- c++1x = C++11
- c++1y = C++14
- c++1z = C++17
- c++2a = C++20
Например, если вы видите c++1z, это синоним стандарта языка C++17.
Настройка стандарта языка C++ в Visual Studio
На момент написания Visual Studio 2019 по умолчанию использует возможности C++14, что не позволяет использовать новые функции, представленные в C++17 (и C++20), некоторые из которых будут рассмотрены в будущих уроках.
Чтобы использовать эти новые функции, вам необходимо активировать новый языковой стандарт. К сожалению, в настоящее время нет возможности сделать это глобально – вы должны делать это для каждого проекта отдельно.
Для этого откройте свой проект, затем перейдите в меню Проект (Project) → Свойства (Properties) (имя вашего приложения), затем откройте Свойства конфигурации (Configuration Properties) → C/C++ → Язык (Language).
Там вы можете установить стандарт языка C++ на ту версию C++, которую хотите использовать.
На момент написания мы рекомендуем выбрать «Стандарт ISO C++17 (/std:c++17)» (ISO C++17 Standard (/std:c++17)), который является последним стабильным стандартом.
Если вы хотите поэкспериментировать с возможностями будущего языкового стандарта C++20, выберите «Предварительная версия – функции из последнего рабочего черновика C++ (/std:c++latest)» (ISO C++Latest (/std:c++latest)). Просто обратите внимание, что поддержка может быть нестабильной или глючной.
Настройка стандарта языка C++ в Code::Blocks
Code::Blocks может по умолчанию использовать языковой стандарт до C++11. Обязательно проверьте и убедитесь, что включен более современный языковой стандарт.
Хорошая новость заключается в том, что Code::Blocks позволяет установить языковой стандарт глобально, поэтому вы можете настроить его один раз (а не для каждого проекта). Для этого перейдите в меню Settings (Настройки) → Compiler (Компилятор):
Затем найдите поле или поля с надписью «Have g++ follow the C++XX ISO C++ language standard [-std=c++XX]», где XX – это 11, 14 или другое большее число (смотрите элементы внутри прямоугольников на скриншоте ниже):
Отметьте тот, у которого наибольшее число (на изображении выше это вариант C++17 внутри синего прямоугольника).
Ваша версия Code::Blocks может также поддерживать будущие (или только что выпущенные) версии C++. Если это так, они будут помечены как «Have g++ follow the coming C++XX (aka C++YY) ISO C++ language standard [-std=c++XX]» (синий прямоугольник на скриншоте ниже). При желании вы можете включить их, если хотите использовать функции, добавленные в этих версиях, но обратите внимание, что поддержка может быть неполной (т.е. некоторые функции могут отсутствовать).
Смотрите список в верхней части статьи, где приведен список кодовых названий, соответствующих языковым стандартам.
Например, если вы хотите включить возможности C++17, а в ваших настройках нет параметра C++17, найдите -std=c++1z (кодовое название для C++17).
Кроме того, вы можете перейти на вкладку «Other Compiler Options» (Другие параметры компилятора) и ввести -std=c++17.
Примечание
Это будет работать, если ваш компилятор поддерживает C++17. Если вы используете старую версию Code::Blocks, и функции C++17 не работают, обновите компилятор.
Установка языкового стандарта в g++
Для GCC/G++ вы можете передать флаги компилятора -std=c++11, -std=c++14, -std=c++17 или -std=c++2a, чтобы включить C++11/14/17/2a соответственно.
Тестирование вашего компилятора
После включения C++17 или выше вы сможете скомпилировать следующий код без каких-либо предупреждений или ошибок.
#include <array>
#include <iostream>
#include <string_view>
#include <tuple>
#include <type_traits>
namespace a::b::c
{
inline constexpr std::string_view str{ "hello" };
}
template <class... T>
std::tuple<std::size_t, std::common_type_t<T...>> sum(T... args)
{
return { sizeof...(T), (args + ...) };
}
int main()
{
auto [iNumbers, iSum]{ sum(1, 2, 3) };
std::cout << a::b::c::str << ' ' << iNumbers << ' ' << iSum << 'n';
std::array arr{ 1, 2, 3 };
std::cout << std::size(arr) << 'n';
return 0;
}
Если вы не можете скомпилировать этот код, то вы либо не включили C++17, либо ваш компилятор не полностью его поддерживает. В последнем случае установите последнюю версию вашей IDE/компилятора, как описано в уроке «0.6 – Интегрированная среда разработки (IDE)».
Теги
C++ / CppCode::BlocksIDELearnCppVisual StudioДля начинающихКомпиляторОбучениеПрограммированиеСтандарт
Visual Studio Code ships by default with English as the display language and other languages rely on Language Pack extensions available from the Marketplace.
VS Code detects the operating system’s UI language and will prompt you to install the appropriate Language Pack, if available on the Marketplace. Below is an example recommending a Simplified Chinese Language Pack:
After installing the Language Pack extension and following the prompt to restart, VS Code will use the Language Pack matching your operating system’s UI language.
Note: This topic explains how to change the display language in the VS Code UI via Language Packs such as French or Chinese. If you want to add programming language support, for example for C++ or Java, refer to the Programming Languages section of the documentation.
Changing the Display Language
You can also override the default UI language by explicitly setting the VS Code display language using the Configure Display Language command.
Press ⇧⌘P (Windows, Linux Ctrl+Shift+P) to bring up the Command Palette then start typing «display» to filter and display the Configure Display Language command.
Press Enter and a list of installed languages by locale is displayed, with the current locale
highlighted.
Use the Install additional languages… option to install more Language Packs from the Marketplace, or select a different locale
from the list. Changing the locale
requires a restart of VS Code. You will be prompted to restart when you select a locale
.
The Configure Display Language command writes to the Runtime Configuration Arguments file argv.json
in your user VS Code folder (.vscode
).
The locale
can also be changed by editing the argv.json
file directly (Preferences: Configure Runtime Arguments) and restarting VS Code.
Available locales
Display Language | Locale |
---|---|
English (US) | en |
Simplified Chinese | zh-cn |
Traditional Chinese | zh-tw |
French | fr |
German | de |
Italian | it |
Spanish | es |
Japanese | ja |
Korean | ko |
Russian | ru |
Portuguese (Brazil) | pt-br |
Turkish | tr |
Polish | pl |
Czech | cs |
Marketplace Language Packs
As described above, VS Code ships with English as the default display language, but other languages are available through Marketplace Language Packs.
You can search for Language Packs in the Extensions view (⇧⌘X (Windows, Linux Ctrl+Shift+X)) by typing the language you are looking for along with category:"Language Packs"
.
You can have multiple Language Packs installed and select the current display language with the Configure Display Language command.
Setting the Language
If you want to use a specific language for a VS Code session, you can use the command-line switch --locale
to specify a locale when you launch VS Code.
Below is an example of using the --locale
command-line switch to set the VS Code display language to French:
code . --locale=fr
Note: You must have the appropriate Language Pack installed for the language you specify with the command-line switch. If the matching Language Pack is not installed, VS Code will display English.
Common questions
Unable to write to file because the file is dirty
This notification may mean that your argv.json
file wasn’t saved after a previous change. Check if there are any errors in the file (Preferences: Configure Runtime Arguments), make sure the file is saved, and try to install the Language Pack again.
Can I contribute to a language pack’s translations?
Yes, the Visual Studio Code Community Localization Project is open to anyone, where contributors can provide new translations, vote on existing translations, or suggest process improvements.
How can I enable a programming language like Python?
Refer to the Programming Languages section to learn how to install support for programming languages, such as PHP, Python, and Java.
2/2/2023
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
По мере изучения основ C# я пробую также переписать один из моих проектов с Delphi на C#. Пишу я пока без всяких изысков вроде визуального интерфейса, так как программа хоть и большая, но максимум, что пока от неё требуется — это собрать csv-файл из рассчитанных данных и визуализировать кое-какие моменты работы в Google Earth при помощи kml-файла. Когда я писал часть про логические операции, то мне понравилось использование выражения switch
вместо одноименной конструкции — коротко, понятно и лаконично. Однако , эта возможность доступна для использования только с версии C# 8.0, а у меня приложение разрабатывалось на .NET Framework 4.7.2 и C# 7.3, соответственно. А так как кода было написано уже достаточно много, то пришлось думать над тем, как перенести моё консольное приложение с .NET Framework 4.7.2 на NET Core 3.1.
Смена версий языка C# в Visual Studio 2019 не работает
Первое, что я предпринял для того, чтобы как можно более безболезненно сменить C# 7.3 на C# 8.0 — это попробовал изменить версию языка в Visual Studio. Судя по найденным на просторах Интернет инструкциям, делалось это через свойства проекта: надо было дважды кликнуть по Properties в обозревателе решений, затем, в открывшемся окне перейти на вкладку «Сборка», кликнуть кнопку «Дополнительно…» и, в открывшемся окне выбрать необходимую версию языка. Однако, в Visual Studio 2019 такой «фокус»не прошел:
Microsoft позаботился о том, чтобы разместить под неактивным списком выбора версии C# пояснение того, почему на данный момент нельзя сменить версию языка. Судя по полученной информации, компилятор C# последней версии определяет версию языка по умолчанию на основе целевой платформы или платформ проекта, интерфейс смены версии C# теперь не работает, а новые функции C# 8.0 поддерживаются только на .NET Core 3.x. Так что, чтобы «пощупать» новинки в C# 8.0 пришлось искать вариант того, как быстро мигрировать с .NET Framework 4.7.2 на NET Core 3.1.
Вариант перехода с .NET Framework 4.7.2 на NET Core 3.1 нашелся относительно быстро на Хабре в блоге Microsoft (кто бы подумал), правда для консольного приложения пришлось его совсем чуточку доработать и добавить в этот вариант ещё один шаг. В конце этой статьи я приведу ссылку на первоисточник информации, чтобы соблюсти все правила цитирования.
Шаг 1. Запуск Portability Analyzer
Portability Analyzer — это небольшая утилита, которая анализирует код вашего проекта с целью выявления возможных проблем при переносе проекта на другую платформу. Скачать Portability Analyzer можно с вот этой странички.
Запускаем Portability Analyzer и указываем расположение исходного кода проекта:
После этого откроется файл Excel с отчётом по проверке. У меня этот файл выглядел следующим образом:
Оказалось, что используемая в моем проекте сборка SharpKml не на все 100% поддерживается в .NET Standard 1.2, но для .NET Core 3.1 подходит. Значит всё хорошо, можно переходить к следующему шагу. Если бы анализатор показал меньше 100% совместимости с .NET Core 3.1, то пришлось бы искать либо другую версию SharpKml или же искать альтернативу.
Шаг 2. Миграция .csproj в SDK-стиле
В Обозревателе решений необходимо кликнуть правой кнопкой мыши по своему проект и посмотреть есть ли в контекстном меню пункт «Изменить файл проекта». Вот так выглядит этот пункт в Visual Studio 2019:
А вот так будет выглядеть контекстное меню проекта без пункта:
Если пункт «Изменить файл проекта» имеется, то можно переходить к следующему шагу. Если же пункта нет, то делаем следующее:
- Смотрим, есть ли в проекта файл packages.config. В «Обозревателе решений» он выглядит вот так:
Если файл имеется, то кликаем на нем правой кнопкой мыши и выбираем пункт «Перенести packages.config в PackageReference…«:
Появится окно в котором необходимо нажать «Ok»
2. Выгружаем проект. Для этого кликаем по названию проекта правой кнопкой мыши и выбираем пункт «Выгрузить проект»
После выгрузки проект в «Обозревателе решений» будет выглядеть вот так:
Снова кликаем по названию проекта правой кнопкой мыши и выбираем пункт «Изменить название_проекта.cproj«. В моем случае этот пункт выглядел вот так:
Откроется XML-файл примерно такого содержания:
Содержимое этого файла необходимо скопировать в «Блокнот». Теперь необходимо удалить всё из файла в Visual Studio. Согласен с автором первоисточника данной инструкции, что звучит такой пункт, мягко говоря, угрожающе. Но, на деле, ничего страшного не произойдет. Удаляйте — не переживайте (копия лежит в «Блокноте»).
Вместо только что удаленного текста вставьте следующий код необходимый для консольного приложения(здесь небольшое расхождение с первоисточником):
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> </Project>
Теперь переходим в Блокнот и ищем там строку PackageReference. Если ничего не нашли — двигаемся дальше. Если нашли PackageReference, то копируем весь узел ItemGroup, содержащий PackageReference, в файл проекта, открытого в Visual Studio. Вставлять скопированный текст необходимо перед закрывающим тегом </Project>
, а не в конец файла, как это было сказано в первоисточнике. Скопированный блок должен выглядеть так:
<ItemGroup> <PackageReference Include="SharpKml.Core"> <Version>5.1.2</Version> </PackageReference> <PackageReference Include="System.Runtime.WindowsRuntime" Version="4.7.0" /> </ItemGroup>
У меня такой блок оказался всего один, поэтом итоговый файл *.cproj стал выглядеть вот так:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="SharpKml.Core"> <Version>5.1.2</Version> </PackageReference> </ItemGroup> </Project>
Теперь делаем то же самое, что и выше, но только для ProjectReference. Нашли ProjectReference — копируем весь ItemGroup в конец файла перед закрывающим тегом </Project>
. У меня в Блокноте таких строк не оказалось, поэтому я перешел к следующему шагу — сохраняем все и перезагружаем проект кликнув правой кнопкой мыши по названию проекта и выбрав пункт «Перезагрузить проект». Теперь наш проект в «Обозревателе решений» стал выглядеть немного по другому:
В принципе, на этом переход с .NET Framework 4.7.2 на NET Core 3.1 закончен — можно попробовать запустить проект и убедиться, что все работает. Однако у меня при попытке запуска приложения посыпались ошибки вида:
Ошибка CS0579 Повторяющийся атрибут «System.Reflection.AssemblyCompanyAttribute» ConsoleApp3 J:CSharp SourcesMrr2017_recoveryMrr2017ConsoleApp3objDebugnetcoreapp3.1ConsoleApp3.AssemblyInfo.cs
Помогло удаление файла AssemblyInfo.cs
То, что удаление файла AssemblyInfo.cs помогло мне — не значит, что поможет вам. Если не жалко проект — можете повторить мои действия, но лучше проконсультироваться со специалистами.
После этого проект запустился, работоспособность не нарушилась. Однако встретилась другая проблема.
Использование System.Windows в .NET Core
До перехода на .NET Core для работы с координатами точек, полигонами и так далее я использовал стандартные классы Windows из пространства имен System.Windows (добавив предварительно ссылку в Зависимости). Однако, в .NET Core Visual Studio «ругнулась» на то, что в этом пространстве имен классов типа Point
и Rect
не существует и пометила using System.Windows
серым цветом с предложением удалить неиспользуемые директивы:
Решение нашлось на StackOverflow. Для того, чтобы использовать стандартные примитивы из Windows типа Point и Rect для приложения на .NET Core 3.x необходимо установить пакет System.Runtime.WindowsRuntime
через менеджер пакетов NuGet. Для этого кликаем по названию проекта правой кнопкой мыши и выбираем пункт «Управление пакетами NuGet»
В окне менеджера пакетов переходим на вкладку «Обзор» и забиваем в строку поиска System.Runtime.WindowsRuntime
.
Жмем кнопку установить и ждем пока NuGet установит пакет. После установки пакета проект в «Обозревателе решений» станет выглядеть вот так:
Теперь необходимо добавить в проект пространство имен:
using Windows.Foundation;
И можно пользоваться классами Point
и Rect
:
Вот так простое человеческое желание использовать в работе новейшие возможности языка C# привели к переносу проекта c .NET Framework 4.7.2 на NET Core 3.1. Надеюсь, что вам эта небольшая инструкция пригодиться.
Источники информации:
- Статья на Хабре: Перенос десктопных приложений на .NET Core
- StackOverflow: Using System.Windows in .NET Core
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
0 / 0 / 0 Регистрация: 17.08.2020 Сообщений: 1 |
|
1 |
|
17.08.2020, 18:53. Показов 31614. Ответов 2
Столкнулся с проблемой,что Visual Studio сам изменил версию языка ( или он дурит мне мозги ) , ранее эту проблему смог решить благодаря запуску чистого проекта и записи всего кода с нуля,но сейчас не помогло,если кто сталкивался с этой проблемой,то как вы ее решали?
__________________
0 |
6270 / 3898 / 1567 Регистрация: 09.05.2015 Сообщений: 9,188 |
|
17.08.2020, 19:16 |
2 |
Версия языка зависит от типа проекта. Например в проектах .NET Framework вы не можете использовать версию выше 7.3. C# 8.0 поддерживается в проектах .NET Core 3.x и выше.
1 |
sanec38 Жесток & Наивен 481 / 186 / 91 Регистрация: 02.02.2017 Сообщений: 427 |
||||||||
18.08.2020, 04:00 |
3 |
|||||||
Редактируйте файл .csproj. добавляете туда.
или
И статический локальный метод будет доступен и еще не которые фичи. Для остальных придется качать пакеты.Например для асинхронных потоков Microsoft.Bcl.AsyncInterfaces.Для index и range поищите в nuget rangeindex. И так далее.
3 |