Какие существуют версии C# и как они соотносятся с версиями .NET и Visual Studio?
Полная таблица соответствия версий 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# в проекте?
- Откройте файл
.csproj(щелкните правой кнопкой по проекту → "Edit Project File"). - Найдите или добавьте элемент
<LangVersion>внутри<PropertyGroup>. - Установите нужное значение:
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> или другую нужную.