C # 8은 .NET Framework를 지원합니까?


131

Visual Studio 2019 고급 빌드 설정에서 C # 8은 .NET Framework 프로젝트에 대해 사용할 수없는 것으로 보이며 .NET Core 3.0 프로젝트에 대해서만 (아래 그림 참조) 사용할 수 있습니다.

여기에 이미지 설명 입력

C # 8은 .NET Framework를 지원합니까?

답변:


239

예, C # 8은 .NET Framework 및 Visual Studio 2019에서 .NET Core 3.0 / .NET Standard 2.1 이전의 기타 대상 (또는 Nuget 패키지설치하는 경우 이전 버전의 Visual Studio )과 함께 사용할 수 있습니다.

언어 버전은 8.0csproj 파일에서 로 설정되어야 합니다.

모든 기능은 아니지만 대부분의 기능은 대상 프레임 워크에 관계없이 사용할 수 있습니다.


작동하는 기능

다음 기능은 구문 변경 일뿐입니다. 프레임 워크에 관계없이 작동합니다.

작동하도록 만들 수있는 기능

.NET Framework에없는 새로운 유형이 필요합니다. "polyfill"Nuget 패키지 또는 코드 파일과 함께 만 사용할 수 있습니다.

기본 인터페이스 멤버-작동하지 않음

기본 인터페이스 멤버 는 .NET Framework에서 컴파일되지 않으며 CLR에서 런타임 변경이 필요하기 때문에 작동하지 않습니다. 이제 .NET Core가 앞으로 나아감에 따라 .NET CLR이 고정되었습니다.

작동하는 것과 작동하지 않는 것, 가능한 폴리 필에 대한 자세한 내용은 Stuart Lang의 기사, C # 8.0 및 .NET Standard 2.0-Doing Unsupported Things를 참조하십시오 .


암호

.NET Framework 4.8을 대상으로하고 C # 8 nullable 참조 형식을 사용하는 다음 C # 프로젝트는 Visual Studio 16.2.0에서 컴파일됩니다. .NET Standard Class Library 템플릿을 선택한 다음 대신 .NET Framework를 대상으로 편집하여 만들었습니다.

.csproj :

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net48</TargetFrameworks>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

.cs :

namespace ClassLibrary1
{
    public class Class1
    {
        public string? NullableString { get; set; }
    }
}

그런 다음 레거시 .csproj형식을 사용하여 .NET Framework 4.5.2 WinForms 프로젝트를 시도 하고 동일한 nullable 참조 형식 속성을 추가했습니다. Visual Studio 고급 빌드 설정 대화 상자 (16.3에서 비활성화 됨)에서 언어 유형을 변경 latest하고 프로젝트를 저장했습니다. 물론이 시점에서는 빌드되지 않습니다. 텍스트 편집기에서 프로젝트 파일을 열고 빌드 구성에서로 변경 latest했습니다 .previewPropertyGroup

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
   <LangVersion>preview</LangVersion>

그런 다음 <Nullable>enable</Nullable>main 에 추가 하여 nullable 참조 유형에 대한 지원을 활성화했습니다 PropertyGroup.

<PropertyGroup>
   <Nullable>enable</Nullable>

프로젝트를 다시로드하면 빌드됩니다.


피투성이 세부 사항

이 답변이 처음 작성되었을 때 C # 8은 미리보기에 있었고 많은 수사 작업이 포함되었습니다. 나는 후손을 위해 그 정보를 여기에 남겨둔다. 피투성이의 세부 사항을 모두 알 필요가 없다면 건너 뛰어도됩니다.

일부 기능에는 새로운 유형이나 CLR 지원이 필요하지만 C # 언어는 역사적으로 대부분 프레임 워크 중립적 이었습니다. 즉, 이전 버전의 프레임 워크를 컴파일 할 수있었습니다.

대부분의 C # 애호가들은 Mads Torgersen의 Building C # 8.0 블로그 항목을 읽었을 것입니다.이 블로그 항목 은 C # 8의 특정 기능에 플랫폼 종속성이 있음을 설명합니다.

비동기 스트림, 인덱서 및 범위는 모두 .NET Standard 2.1의 일부가 될 새로운 프레임 워크 유형에 의존합니다. .NET Core 3.0과 Xamarin, Unity 및 Mono는 모두 .NET Standard 2.1을 구현하지만 .NET Framework 4.8은. 아니. 즉, 이러한 기능을 사용하는 데 필요한 유형은 .NET Framework 4.8에서 사용할 수 없습니다.

이것은 C # 7에 도입 된 Value Tuples 와 비슷해 보입니다 .이 기능에는 ValueTuple4.7 이하의 NET Framework 버전이나 2.0 이전의 .NET Standard에서는 사용할 수 없었던 새로운 유형 ( 구조)이 필요했습니다 . 그러나 C # 7은 값 튜플없이 또는 System.ValueTuple Nuget 패키지를 설치하여 이전 버전의 .NET에서 계속 사용할 수 있습니다 . Visual Studio는 이것을 이해했으며 모든 것이 세상에 괜찮 았습니다.

그러나 Mads는 또한 다음과 같이 썼습니다.

이러한 이유로 C # 8.0 사용은 .NET Standard 2.1을 구현하는 플랫폼에서만 지원됩니다.

... 사실이라면 모든 버전의 .NET Framework에서 C # 8을 사용하는 것을 배제했을 것입니다. 실제로 최근에야 라이브러리 코드의 기준 대상으로 사용하도록 권장 된 .NET Standard 2.0 라이브러리에서도 마찬가지입니다. 3.0 이전의 .NET Core 버전에서도 .NET Standard 2.0 만 지원하므로 사용할 수 없습니다.

조사가 시작되었습니다! -

  • Jon Skeet에는 .NET Standard 2.0만을 대상 으로 하는 C # 8을 사용하는 Noda-Time의 알파 버전이 있습니다. 그는 C # 8 / .NET Standard 2.0이 .NET 제품군의 모든 프레임 워크를 지원할 것으로 기대하고 있습니다. (또한 Jon의 블로그 게시물 "Nullable 참조 유형이있는 첫 번째 단계"참조 ).

  • Microsoft 직원은 GitHub 에서 C # 8 nullable 참조 형식 대한 Visual Studio UI에 대해 논의 해 왔으며 레거시 csproj(.NET Core SDK 이전 형식 csproj) 를 지원할 예정이라고합니다 . 이것은 C # 8이 .NET Framework와 함께 사용 가능하다는 매우 강력한 표시입니다. [이제 Visual Studio 2019 언어 버전 드롭 다운이 비활성화되고 .NET이 C # 7.3에 연결되었으므로이 문제를 역 추적 할 것입니다.]

  • 유명한 블로그 게시물 직후 GitHub 스레드 에서 크로스 플랫폼 지원에 대해 논의했습니다. 중요한 점은 .NET Standard 2.1에 인터페이스의 기본 구현이 지원됨을 나타내는 마커가 포함 된다는 것입니다.이 기능에는 .NET Framework에서 사용할 수없는 CLR 변경이 필요합니다. 다음은 Microsoft .NET 팀의 프로그램 관리자 인 Immo Landwerth의 중요한 내용입니다.

    컴파일러 (예 : C #)는이 필드의 존재를 사용하여 기본 인터페이스 구현을 허용할지 여부를 결정해야합니다. 필드가있는 경우 런타임은 결과 코드를로드 및 실행할 수 있어야합니다.

  • 이 모든 것은 "C # 8.0은 .NET Standard 2.1을 구현하는 플랫폼에서만 지원됩니다."가 지나치게 단순화되었으며 C # 8은 .NET Framework를 지원하지만 불확실성이 너무 많아서 GitHub 에서 물었고 HaloFour는 다음과 같이 대답했습니다.

    IIRC, .NET Framework에 확실히 나타나지 않을 유일한 기능은 런타임 변경이 필요한 DIM (기본 인터페이스 메서드)입니다. 다른 기능은 .NET Framework에 추가되지 않을 수 있지만 자체 코드 또는 NuGet (범위, 인덱스, 비동기 반복기, 비동기 처리)을 통해 폴리 필 할 수있는 클래스의 모양에 따라 결정됩니다.

  • Victor Derks 는 " 더 복잡한 nullable 사용 사례를 디자인하는 데 필요한 새로운 nullable 특성 은 .NET Core 3.0 및 .NET Standard 2.1과 함께 제공되는 System.Runtime.dll에서만 사용할 수 있습니다. [그리고] .NET Framework와 호환되지 않습니다. 4.8 인치

  • 그러나 Immo Landwerth Try out Nullable Reference Types 기사에서 "유형이 완전히 제네릭이거나 null이 아니기 때문에 대부분의 API에는 사용자 지정 속성이 필요하지 않습니다."라고 언급했습니다.

  • Ben Hall 은 GitHub에서 Core 3.0 외부의 nullable 특성 가용성 문제를 제기했으며 Microsoft 직원의 다음 의견이 주목되었습니다.

C # 8은 .net core 3.0 및 .net Standard 2.1에서만 완전히 지원됩니다. .net core 2.1과 함께 C # 8을 사용하도록 프로젝트 파일을 수동으로 편집하면 지원되지 않는 지역에있는 것입니다. 일부 C # 8 기능은 제대로 작동하고 일부 C # 8 기능은 너무 잘 작동하지 않으며 (예 : 성능 저하) 일부 C # 8 기능은 추가 해킹으로 작동하며 일부 C # 8 기능은 전혀 작동하지 않습니다. 설명하기 매우 복잡합니다. 우리는 그것을 적극적으로 차단하지 않으므로 탐색 할 수있는 전문 사용자가 그렇게 할 수 있습니다. 이 지원되지 않는 믹스 앤 매치를 광범위하게 사용하는 것은 권장하지 않습니다.

(Jan Kotas)

기꺼이 이해하고 해결하고자하는 여러분과 같은 사람들은 C # 8을 자유롭게 사용할 수 있습니다. 요점은 모든 언어 기능이 하위 수준 대상에서 작동하는 것은 아니라는 것입니다.

(Immo Landwerth)


비주얼 스튜디오 2019

Visual Studio 2019 버전 16.3의 RTM 버전에서 주요 변경 사항이 있습니다. C # 8.0의 시작 버전 : 언어 선택 드롭 다운이 비활성화되었습니다.

여기에 이미지 설명 입력

이에 대한 Microsoft의 근거 는 다음과 같습니다.

앞으로 ... 각 프레임 워크의 각 버전은 단일 지원 및 기본 버전을 갖게되며 임의 버전은 지원하지 않습니다. 이러한 지원 변경 사항을 반영하기 위해이 커밋은 언어 버전 콤보 상자를 영구적으로 비활성화하고 변경 사항을 설명하는 문서에 대한 링크를 추가합니다.

열리는 문서는 C # 언어 버전 관리 입니다. NET Core 3.x 전용 기본 언어로 C # 8.0이 나열됩니다. 또한 앞으로 각 프레임 워크의 각 버전이 단일 지원 및 기본 버전 을 갖게 될 것이며 언어의 프레임 워크 불가지론이 더 이상 신뢰할 수 없음을 확인합니다.

.csproj 파일을 편집하여 .NET Framework 프로젝트의 경우 언어 버전을 8로 강제 설정할 수 있습니다.


주의 사항

C # 8 / .NET Framework 조합은 Microsoft에서 공식적으로 지원하지 않습니다. 전문가만을위한 것이라고 그들은 말합니다.


3
- 우리가하려고하면이 외부 표준 2.1의 일부 C # 8 기능을 사용하여, 우리가 할 수있는 사실에 따른 혼란을 취소해야 github.com/dotnet/corefx/issues/40039
벤 홀

2
더 복잡한 nullable 사용 사례를 디자인하는 데 필요한 새로운 nullable 특성 ( docs.microsoft.com/en-us/dotnet/csharp/nullable-attributes )은 .NET Core 3.0 및 .NET과 함께 제공되는 System.Runtime.dll에서만 사용할 수 있습니다. NET 표준 2.1. 이 널 (NULL) \ C # 8.0 호환으로, NET 프레임 워크 4.8 만든다
빅터 DERKS

3
@BenHall 문제에 대한 몇 가지 요약을 추가했습니다. 문제를 제기하고 여기에 게시 해 주셔서 대단히 감사합니다. 답이 잘못된 경우 자유롭게 수정하십시오.
Stephen Kennedy

3
을 통해 지정된 경우 비주얼 스튜디오 2019 인텔리는 널 (NULL) 참조 형식을 지원하지 않습니다 <Nullable>enable</Nullable>csproj. #nullable enable지시문을 사용할 때 작동하는 것 같습니다 . 참조 : github.com/dotnet/project-system/issues/5551
Bouke

3
@odalet 나는 C # 8을 대상으로하고 polyfill이 필요하지 않은 기본 기능을 사용하지 않으며 (이미 그렇게 함) polyfill도 사용할 수 있습니다 (필요하지 않음). 그러나 제가 할 수있는 가장 좋은 조언은 : 의심 스러우면하지 마십시오. 적어도 당신의 직업이 그것에 의존한다면하지 마십시오.
Stephen Kennedy

34

이 블로그 항목 에 따르면 언어는 실제로 프레임 워크에 연결되어 있습니다.

즉, 이러한 기능을 사용하는 데 필요한 유형은 .NET Framework 4.8에서 사용할 수 없습니다. 마찬가지로 기본 인터페이스 멤버 구현은 새로운 런타임 향상 기능에 의존하며 .NET Runtime 4.8에서도 이러한 기능을 만들지 않을 것입니다.

이러한 이유로 C # 8.0 사용은 .NET Standard 2.1을 구현하는 플랫폼에서만 지원됩니다. 런타임을 안정적으로 유지해야했기 때문에 10 년 이상 새로운 언어 기능을 구현할 수 없었습니다. 현대 런타임의 나란히있는 오픈 소스 특성으로 인해 우리는 책임감있게 그것들을 다시 발전시키고이를 염두에두고 언어 디자인을 할 수 있다고 생각합니다. Scott은 .NET Core 3.0 및 .NET Framework 4.8에 대한 업데이트에서 .NET Framework가 안정성과 안정성에 초점을 맞추는 대신 향후 혁신이 줄어들 것이라고 설명했습니다. 그 점을 감안할 때, 우리는 아무도 그것을 얻지 못하는 것보다 일부 언어 기능을 놓치는 것이 낫다고 생각합니다.


3
Stephen Kennedy의 다른 답변에 대한 자세한 내용이 있습니다. 실제로 .NET Framework를 대상으로 할 때 C # 8.0의 상당 부분이 작동하도록 만드는 것은 쉽습니다. 그러나 C # 8.0의 일부 부분에서는 Microsoft가 "이전".NET Framework에 대해 만들지 않을 런타임을 변경해야합니다. 그리고 그들은 언어 버전과 .NET 버전을 더 밀접하게 묶는 것 같습니다.
Jeppe Stig Nielsen

1

C # 8.0 이상은 .NET Core 3.x 이상 버전에서만 지원됩니다. 대부분의 최신 기능에는 .NET Core 3.x에 도입 된 라이브러리 및 런타임 기능이 필요합니다. C # 언어 버전 관리


3
위의 @stephen kennedy의 정답으로 표시된 답변을 보셨습니까?
James Harcourt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.