Avatar ·

Какие версии C# соответствуют каждой версии .NET и Visual Studio?

Всем привет! Я начинающий C#-разработчик, и меня постоянно путают версии. Я знаю, что есть C# 7.0, C# 8.0, C# 9.0 и так далее, но я не понимаю, как они соотносятся с версиями .NET Framework, .NET Core и Visual Studio. Вот пример: я открываю Visual Studio 2019, создаю проект .NET Framework 4.7.2. Какую версию C# я могу использовать? А если я создам проект .NET Core 3.1? А .NET 5? И что будет, если я попробую написать код на C# 9.0 (например, использовать records) в проекте .NET Framework 4.8? ```csharp // Я хочу использовать record (C# 9.0) public record Person(string Name, int Age); // Но мой проект на .NET Framework 4.8 - это скомпилируется? ``` Мне кажется, что Microsoft постоянно меняет нумерацию, и я боюсь, что использую не ту версию языка в своём проекте. Подскажите, есть ли какая-то таблица соответствия? И как понять, какую версию C# я реально могу использовать в своём проекте? Заранее спасибо за помощь! <<>>

Соответствие версий C#, .NET и Visual Studio

Вы столкнулись с классической проблемой всех C#-разработчиков. Microsoft действительно изменила схему нумерации после выхода .NET Core, но путаницу можно легко устранить, запомнив одно простое правило: версия C# привязана к версии компилятора, который поставляется с конкретной версией Visual Studio или SDK .NET. При этом версия языка не всегда совпадает с версией платформы (фреймворка).

Основная таблица соответствия

Вот ключевое соответствие, которое нужно запомнить (актуально на 2024 год):

  • C# 1.0 — .NET Framework 1.0 (VS 2002)
  • C# 2.0 — .NET Framework 2.0 (VS 2005)
  • C# 3.0 — .NET Framework 3.5 (VS 2008)
  • C# 4.0 — .NET Framework 4.0 (VS 2010)
  • C# 5.0 — .NET Framework 4.5 (VS 2012)
  • C# 6.0 — .NET Framework 4.6 (VS 2015)
  • C# 7.0-7.3 — .NET Framework 4.6.2+ / .NET Core 2.x (VS 2017)
  • C# 8.0 — .NET Core 3.x / .NET Standard 2.1 (VS 2019 v16.3+)
  • C# 9.0 — .NET 5 (VS 2019 v16.8+)
  • C# 10.0 — .NET 6 (VS 2022)
  • C# 11.0 — .NET 7 (VS 2022 v17.4+)
  • C# 12.0 — .NET 8 (VS 2022 v17.8+)

Важный нюанс: .NET Framework vs .NET (Core)

Здесь кроется главная ловушка. Начиная с C# 7.0, Microsoft разделила возможности языка и возможности платформы. .NET Framework 4.8 (последняя версия) поддерживает максимум C# 7.3. Да, вы можете установить Visual Studio 2022 и писать код, но компилятор всё равно будет ограничен версией 7.3 для проектов .NET Framework. Это связано с тем, что новые фичи C# (например, records из C# 9.0) требуют типов из .NET Core/.NET 5+.

Ваш пример с record в .NET Framework 4.8 не скомпилируется, даже если вы используете последнюю Visual Studio. Вам нужно переключиться на .NET 5+.

Как проверить, какая версия C# используется?

Есть несколько способов:

  1. Через файл проекта: откройте .csproj и найдите элемент <LangVersion>. Если его нет, используется версия по умолчанию (зависит от целевой платформы).
  2. Через Visual Studio: ПКМ по проекту → Properties → Build → Advanced → Language Version.
  3. Программно: используйте директиву #error version — компилятор выдаст ошибку с указанием версии.

Пример настройки в .csproj

Если вы хотите принудительно задать версию C# (например, использовать C# 10 в проекте .NET 6):

<PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <LangVersion>10.0</LangVersion>
</PropertyGroup>

Рекомендация

Для новых проектов используйте .NET 6+ (LTS версии) — это даст вам доступ к C# 10+ и всем современным фичам. Если вы поддерживаете легаси на .NET Framework, смиритесь с C# 7.3. Никогда не пытайтесь использовать фичи из более новой версии C# в старом фреймворке — это приведёт к ошибкам компиляции.

<<>>

Дополнение: Как работает обратная совместимость

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

Также есть тонкость с .NET Standard. Если ваша библиотека нацелена на .NET Standard 2.0, вы можете использовать C# 7.3 (максимум). Для .NET Standard 2.1 — C# 8.0. Это ограничение важно для библиотек, которые должны работать и на .NET Framework, и на .NET Core.

И последний совет: не зацикливайтесь на версиях языка. В 99% случаев компилятор сам подберёт правильную версию на основе вашего TargetFramework. Если вы используете .NET 8, вы автоматически получаете C# 12. Просто обновляйте SDK и Visual Studio до последних LTS-версий.