Avatar ·

Какие существуют версии C# и как они соотносятся с версиями .NET и Visual Studio?

Всем привет! Я начинающий C# разработчик и постоянно путаюсь в версиях языка. Когда я гуглю какие-то фичи, то вижу упоминания C# 7.0, C# 8.0, C# 9.0 и так далее. При этом у меня установлена Visual Studio 2022 и проект на .NET 6. Я не понимаю, какая версия C# сейчас актуальна и какую версию я использую. Например, я хочу использовать кортежи (tuples) с именованными элементами, но у меня не компилируется код: ```csharp var person = (Name: "Alice", Age: 30); Console.WriteLine(person.Name); ``` Ошибка: "Feature 'tuple' is not available in C# 6. Please use language version 7.0 or greater." Я думал, что если у меня .NET 6, то автоматически используется последняя версия C#. Оказывается, это не так? Или я что-то неправильно настроил? Также я слышал про C# 10, C# 11 и даже C# 12. Можете объяснить, какие вообще бывают версии C#, как они связаны с версиями .NET Framework, .NET Core и Visual Studio? И как узнать, какая версия C# используется в моём проекте? Очень запутался, помогите разобраться! <<>>

Полная таблица соответствия версий C#, .NET и Visual Studio

Вы столкнулись с очень распространённой проблемой. Действительно, версии C# и .NET часто путают, хотя они тесно связаны. Главное правило: версия C# определяется версией компилятора, которая, в свою очередь, зависит от версии SDK .NET и Visual Studio. Однако вы можете переопределить версию языка вручную в файле проекта.

Вот полная таблица соответствия для актуальных версий (на момент .NET 8):

  • C# 1.0 — .NET Framework 1.0 / 1.1 (Visual Studio .NET 2002/2003)
  • C# 2.0 — .NET Framework 2.0 (VS 2005) — дженерики, анонимные методы
  • C# 3.0 — .NET Framework 3.0/3.5 (VS 2008) — LINQ, лямбды, анонимные типы
  • C# 4.0 — .NET Framework 4.0 (VS 2010) — dynamic, именованные/необязательные параметры
  • C# 5.0 — .NET Framework 4.5 (VS 2012) — async/await
  • C# 6.0 — .NET Framework 4.6 (VS 2015) — null-conditional операторы, строковая интерполяция
  • C# 7.0 — .NET Framework 4.6.1 / .NET Core 2.0 (VS 2017) — кортежи, pattern matching
  • C# 7.1-7.3 — .NET Framework 4.7 / .NET Core 2.1-2.2 (VS 2017 15.5+) — async Main, улучшения pattern matching
  • C# 8.0 — .NET Core 3.0 / .NET Standard 2.1 (VS 2019) — nullable reference types, async streams
  • C# 9.0 — .NET 5 (VS 2019 16.8+) — records, init-only setters, top-level statements
  • C# 10 — .NET 6 (VS 2022) — global usings, file-scoped namespaces, record structs
  • C# 11 — .NET 7 (VS 2022 17.4+) — raw string literals, generic math, required members
  • C# 12 — .NET 8 (VS 2022 17.8+) — primary constructors, collection expressions, inline arrays

Теперь по вашей проблеме. Вы используете .NET 6, который по умолчанию включает C# 10. Однако ваша ошибка говорит о C# 6. Это значит, что в вашем проекте явно установлена более старая версия языка. Проверьте файл .csproj. Там может быть строка:

<LangVersion>6</LangVersion>

Если её нет, то C# 10 должен работать. Но если вы используете старый стиль проекта (например, .NET Framework 4.x), то версия может быть ограничена. Для .NET Framework 4.6.1 максимальная версия — C# 7.0 (без дополнительных пакетов).

Как узнать и изменить версию C# в проекте?

  1. Откройте файл .csproj (щелкните правой кнопкой по проекту → "Edit Project File").
  2. Найдите или добавьте элемент <LangVersion> внутри <PropertyGroup>.
  3. Установите нужное значение: latest (последняя доступная), 10, 11 и т.д.

Пример для .NET 6 (C# 10):

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <LangVersion>latest</LangVersion>
</PropertyGroup>

Также вы можете проверить версию в коде, используя директиву #error version (она покажет версию компилятора) или просто посмотрев на IntelliSense — если кортежи подсвечиваются, значит версия подходящая.

Кстати, ваш пример с кортежами должен работать на C# 7.0+, а на C# 10 (с .NET 6) — тем более. Убедитесь, что у вас нет явного ограничения <LangVersion>.

Важное замечание по .NET Framework

Если вы используете старый .NET Framework (4.8 и ниже), вы ограничены версией C#, которую поддерживает установленная Visual Studio. Например, VS 2022 с .NET Framework 4.8 может использовать до C# 7.3 (по умолчанию) или до C# 8.0 с дополнительными настройками (с ограничениями). Для .NET Core и .NET 5+ версия C# всегда соответствует версии SDK.

<<>>

Альтернативный подход: динамическое определение версии

Если вы не хотите заморачиваться с ручной настройкой LangVersion, можно просто всегда использовать latest или default в файле проекта:

<LangVersion>latest</LangVersion>

Это автоматически подхватит последнюю версию C#, доступную в вашей версии SDK. Например, для .NET 8 SDK это будет C# 12.

Также стоит знать, что некоторые фичи C# могут требовать определённых типов из BCL (базовой библиотеки классов). Например, кортежи (C# 7.0+) требуют типа System.ValueTuple, который встроен в .NET Core / .NET 5+, но для .NET Framework 4.6.1 нужно устанавливать NuGet-пакет System.ValueTuple. Если пакета нет, код с кортежами не скомпилируется, даже если версия C# правильная.

Поэтому рекомендую: всегда обновляйте SDK до последней стабильной версии и используйте <LangVersion>latest</LangVersion>. Это избавит вас от головной боли с версиями. А если проект требует старую версию (например, для совместимости), просто явно укажите <LangVersion>7.3</LangVersion> или другую нужную.