programing

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

stoneblock 2023. 5. 9. 22:01

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

Visual Studio 2019 고급 빌드 설정에서 C# 8은 에 사용할 수 없는 것으로 나타납니다.NET Framework 프로젝트(아래 그림과 같이)만 해당됩니다.NET Core 3.0 프로젝트:

여기에 이미지 설명 입력

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

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

은 언어 을 언어버을다설정됩니면다하음로으로 입니다.8.0csproj 파일에 있습니다.디렉토리에서도 이 작업을 수행할 수 있습니다.솔루션의 모든 프로젝트에 적용할 build.props.Visual Studio 2019 버전 16.3 이상에서 이 작업을 수행하는 방법은 아래를 참조하십시오.

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


작동하는 기능

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

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

여기에는 에 없는 새 유형이 필요합니다.NET Framework.다음과 같은 "polyfill" NuGet 패키지 또는 코드 파일과 함께만 사용할 수 있습니다.

기본 인터페이스 구성원 - 작동하지 않음, 작동할 수 없음 및 작동하지 않음

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

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


코드

다음 C# 프로젝트 대상입니다.NET Framework 4.8 및 C#8 nullable 참조 유형 사용은 Visual Studio 16.2.0에서 컴파일됩니다.를 선택하여 만들었습니다.NET 표준 클래스 라이브러리 템플릿을 대상으로 편집합니다.대신 NET Framework:

.nbroj:

<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; }
    }
}

저는 그 다음에 a를 시도했습니다. 4 프로젝트, NET Framework 4.5.2 WinForms , 이전 버전의 WinForms.csproj형식을 지정하고 동일한 null 가능 참조 유형 속성을 추가했습니다.대화상자을 Visual Studio 고급화대상자정드빌(16)로 했습니다.3에서 사용 안 함)에서 언어 유형을 다음으로 변경했습니다.latest프로젝트를 저장했습니다.물론 이 시점에서 그것은 지어지지 않습니다.텍스트 편집기에서 프로젝트 파일을 열고 변경했습니다.latestpreview 구성에서PropertyGroup:

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

한 참조 에 대한 했습니다.<Nullable>enable</Nullable>PropertyGroup:

<PropertyGroup>
   <Nullable>enable</Nullable>

제가 프로젝트를 다시 시작했고, 그것은 구축되었습니다.


비주얼 스튜디오 2019

Visual Studio 2019 버전 16.3의 RTM 버전, C# 8.0의 출시 버전, 언어 선택 드롭다운이 비활성화되었습니다.

여기에 이미지 설명 입력

이에 대한 마이크로소프트의 근거는 다음과 같습니다.

앞으로... 각 프레임워크의 각 버전에는 지원되는 단일 버전과 기본 버전이 있으며 임의 버전은 지원되지 않습니다.이러한 지원 변경사항을 반영하기 위해 이 커밋은 언어 버전 콤보 상자를 영구적으로 사용 불가능으로 설정하고 변경사항을 설명하는 문서에 대한 연결을 추가합니다.

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

언어 버전은 여전히 에 대해 8로 강제 적용할 수 있습니다.NET Framework는 .csproj 파일을 편집하여 프로젝트를 수행합니다.


상세 내역

이 답변이 처음 작성되었을 때, C# 8은 시사회에 있었고 많은 탐정 작업이 수반되었습니다.저는 그 정보를 후세를 위해 여기에 남깁니다.모든 잔인한 세부사항을 알 필요가 없다면 자유롭게 건너뜁니다.

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

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

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

이것은 C# 7에 도입된 Value Tuples와 약간 유사합니다.이 기능에는 새로운 유형이 필요했습니다.ValueTuple구조 - 4.7 또는 . 이하의 NET Framework 버전에서는 사용할 수 없었습니다.2.0보다 오래된 NET 표준입니다.그러나 C# 7은 이전 버전에서도 사용할 수 있습니다.NET 값 튜플이 없거나 시스템을 설치하여 함께 사용할 수 있습니다.ValueTuple Nuget 패키지입니다.Visual Studio는 이것을 이해했고, 세상은 모든 것이 잘 되었습니다.

하지만, Mads는 또한 다음과 같이 썼습니다.

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

...만약 사실이라면 C# 8을 의 어떤 버전과도 함께 사용할 수 없었을 것입니다.NET Framework, 그리고 실제로.NET Standard 2.0 라이브러리는 최근에야 라이브러리 코드의 기준 대상으로 사용하도록 권장되었습니다.당신은 그것을 사용할 수도 없을 것입니다.3.0 이전 버전의 NET Core도 지원합니다.NET 표준 2.0.

수사는 진행 중이었습니다!

  • 존 스키트는 C# 8을 사용하는 알파 버전의 노다 타임을 가지고 있습니다. 어떤 목표를 향해 갈 준비가 되어 있습니다.NET Standard 2.0에만 해당됩니다.그는 분명히 C# 8/을 기대하고 있습니다.의 모든 프레임워크를 지원하는 NET Standard 2.0.NET 제품군. (Jon의 블로그 게시물 "Null 가능한 참조 유형이 있는번째 단계" 참조).

  • Microsoft 직원들은 GitHub의 C#8 nullable 참조 유형에 대한 Visual Studio UI에 대해 논의해 왔으며, 레거시를 지원할 계획이라고 합니다.csprojSDK 포맷 (NET Core SDK 파일)csproj). 는 C.와 할 수 것입니다.NET Framework.[Visual Studio 2019 언어 버전 드롭다운이 비활성화되었기 때문에 이 문제를 되돌릴 것으로 예상됩니다.NET C# 7.3에 되었습니다.

  • 유명한 블로그 게시물 직후, GitHub 스레드는 교차 플랫폼 지원에 대해 논의했습니다.나타난 중요한 점은 그것입니다.NET Standard 2.1에는 인터페이스의 기본 구현이 지원됨을 나타내는 마커가 포함됩니다. 이 기능을 사용하려면 CLR을 변경해야 합니다.NET Framework.여기 중요한 부분이 있습니다. 의 프로그램 매니저인 Imo Landwersh로부터.Microsoft의 NET 팀:

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

  • 이는 모두 "C# 8.0은 구현하는 플랫폼에서만 지원됩니다.NET Standard 2.1"은 지나치게 단순화된 것이며, C# 8은 를 지원할 것입니다.NET Framework이지만 불확실성이 너무 많기 때문에 GitHub에 문의했더니 HaloFour가 다음과 같이 대답했습니다.

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

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

(잔 코타스)

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

(이모 랜드워스)


경고 빈터

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

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

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

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

언급URL : https://stackoverflow.com/questions/56651472/does-c-sharp-8-support-the-net-framework