.NET Framework 프로젝트에서 C# 8.0/9.0 컴파일러를 사용하는 방법
현재 Visual Studio 2019에서는 모든 닷넷 프로젝트에 걸쳐서 기본적으로 C# 컴파일러의 버전을 바꾸지 못하도록 했습니다. 그래서 프로젝트 설정의 고급 빌드(Build / Advanced Build Settings)에 가보면 다음과 같은 식으로 링크가 제공되는데,

Automatically selected based on framework version
Why can't I select a different C# version?
누르면 아래의 문서로 넘어갑니다.
C# language versioning
; https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version
정리해 보면, 생성한 닷넷 프로젝트의 환경에 따라 다음과 같이 C# 컴파일러 버전이 자동 적용된다고 합니다.
.NET 5 - C# 9.0
.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
.NET Framework의 마지막 버전이 4.8이고 그것이 .NET Standard 2.0을 구현하고 있기 때문에 결국 .NET Framework 환경에서는 8.0/9.0 버전의 컴파일러 적용이 안 되고 있는 것입니다.
실제로 .NET 4.8 대상으로 다음의 C# 8.0 (또는 9.0) 코드를 사용해 컴파일하면,
class Program
{
static void Main(string[] args)
{
using var file = new System.IO.StreamReader("test.txt");
}
}
컴파일 오류(CS8370)가 발생합니다.
CS8370 Feature 'using declarations' is not available in C# 7.3. Please use language version 8.0 or greater.
물론 방법은 있습니다. 문서(
C# language versioning)에도 나오지만, 프로젝트 파일(csproj)을 직접 편집기로 열어 LangVersion 노드를 다음과 같이 명시적으로 추가해 주면 됩니다.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" ...[생략]... />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{4F3F253F-549E-42AD-B367-881973F0EEA4}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApp1</RootNamespace>
<AssemblyName>ConsoleApp1</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<LangVersion>9.0</LangVersion>
</PropertyGroup>
// ...[생략]...
</Project>
(LangVersion은 설정 시 바로 반영되지만, 간혹 Visual Studio를 재시작해야 되는 경우도 있습니다.)
이후, 다시 이 글의 예제 코드를 컴파일하면 정상적으로 빌드가 되는 것을 확인할 수 있습니다. 물론, 그래도 모든 C# 8.0/9.0의 구문을 사용할 수 있는 것은 아닙니다. 가령 비동기 스트림 구문의 경우,
Asynchronous streams
; https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#asynchronous-streams
IAsyncEnumerable 타입을 사용해야 하는데,
public static async System.Collections.Generic.IAsyncEnumerable<int> GenerateSequence()
{
for (int i = 0; i < 20; i++)
{
await Task.Delay(100);
yield return i;
}
}
이것이 기본 .NET Frmaework 4.8에는 포함되어 있지 않으므로 컴파일 오류가 발생합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]