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.0
csproj 파일에 있습니다.디렉토리에서도 이 작업을 수행할 수 있습니다.솔루션의 모든 프로젝트에 적용할 build.props.Visual Studio 2019 버전 16.3 이상에서 이 작업을 수행하는 방법은 아래를 참조하십시오.
모든 기능은 아니지만 대부분의 기능은 대상 프레임워크에 상관없이 사용할 수 있습니다.
작동하는 기능
다음 기능은 구문만 변경되며 프레임워크에 관계없이 작동합니다.
- 정적 로컬 기능
- 선언 사용
- Null 병합 할당
- 멤버 읽기 전용
- 일회용 리프랙트
- 위치 패턴
- 튜플 패턴
- 식 전환
- nullable 참조 유형도 지원되지만, 보다 복잡한 nullable 사용 사례를 설계하는 데 필요한 새로운 nullable 특성은 지원되지 않습니다.저는 이것을 "고려 세부사항" 섹션에서 더 자세히 다룹니다.
작동하도록 만들 수 있는 기능
여기에는 에 없는 새 유형이 필요합니다.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
프로젝트를 저장했습니다.물론 이 시점에서 그것은 지어지지 않습니다.텍스트 편집기에서 프로젝트 파일을 열고 변경했습니다.latest
preview
구성에서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에 대해 논의해 왔으며, 레거시를 지원할 계획이라고 합니다.
csproj
SDK 포맷 (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(범위, 인덱스, 비동기식 폐기)을 통해 폴리필할 수 있습니다.
Victor Derks는 "더 복잡한 nullable 사용 사례를 설계하는 데 필요한 새로운 nullable 속성은 System에서만 사용할 수 있습니다.와 함께 제공되는 Runtime.dll.NET Core 3.0 및 .NET 표준 2.1...[그리고] 와 양립할 수 없는NET Framework 4.8"
그러나 Imo Landwerth는 Tryout Nullable Reference Types 기사에서 "대부분의 API는 완전히 일반적이거나 null이 아니기 때문에 사용자 지정 특성이 필요하지 않았습니다."라고 언급했습니다.
Ben Hall은 GitHub의 Core 3.0 외부에서 Null 가능한 특성의 가용성 문제를 제기했으며, 마이크로소프트 직원들은 다음과 같은 언급을 했습니다.
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
'programing' 카테고리의 다른 글
변경된 속성 및 자동 속성 알림 (0) | 2023.05.09 |
---|---|
모듈을 찾을 수 없음: 오류:에서 'fs'을(를) 확인할 수 없습니다. (0) | 2023.05.09 |
Angular 4: 부트스트랩을 어떻게 포함합니까? (0) | 2023.05.09 |
iPhone UI 텍스트 필드 - 자리 표시자 텍스트 색상 변경 (0) | 2023.05.09 |
다른 분기에서 Git에 분기 작성 (0) | 2023.05.09 |