C # 6.0은 .NET 4.0에서 작동합니까?


275

예를 들어 null 전파 및 속성 초기화, 대상 버전 .NET 4.0 설정과 같은 C # 6.0 goodies와 함께 샘플 프로젝트를 만들었습니다. 작동합니다.

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

.NET 4.0을 대상으로하는 소프트웨어에 C # 6.0 기능을 사용할 수 있습니까? 제한이나 단점이 있습니까?


7
.Net 버전 2.0-3.5는 CLR v2.0을 사용합니다. 최신 버전은 CLR v4.0을 사용합니다.
i3arnon

현명하게 최적화하십시오 : 이와 같이 각 고양이에 대해 별도의 null 검사가 추가됩니다
Terence

2
이럴 수가. v4.6을 대상으로하는 WCF를 개발하여 2018 년까지 프로덕션 서버를 업그레이드하지 않을 것입니다. 한 달 분량의 작업에 며칠의 리팩토링이 필요하다고 생각했습니다. 5 분 만에 끝났습니다. 감사합니다. : D
Eric Wu

답변:


286

예 (주로). C # 6.0에는 새로운 Roslyn 컴파일러가 필요하지만 새로운 컴파일러는 이전 프레임 워크 버전을 대상으로 컴파일 할 수 있습니다. 이는 프레임 워크의 지원필요없는 새로운 기능에만 국한됩니다 .

예를 들어 C # 6.0의 문자열 보간 기능을 이전 버전의 .Net과 함께 사용할 수 있지만 (에 대한 호출이 발생 함 string.Format) :

int i = 3;
string s = $"{i}";

IFormattable새로운 프레임 워크 버전 만 추가하면 .Net 4.6이 필요 합니다 System.FormattableString.

int i = 3;
IFormattable s = $"{i}";

언급 한 사례는 프레임 워크의 유형이 필요하지 않습니다. 따라서 컴파일러는 이전 프레임 워크 버전에서 이러한 기능을 완벽하게 지원할 수 있습니다.


31
실제로 .Net 4.6은 필요하지 않으며 몇 가지 유형 만 추가되어 있습니다. 이전 프레임 워크에 직접 추가 할 수 있습니다. 이 코드는 .Net 4.0 및 3.5에서 제대로 작동합니다.
svick

10
.NET 4.0에서 어떤 C # 6 기능이 작동하는지 확인할 수있는 목록이 있습니까? 이를 요청하는 또 다른 방법은 프레임 워크의 지원이 필요한 새로운 기능과 그렇지 않은 기능은 무엇입니까?
Rubenisme

1
@Rubenisme IFormattable문자열 보간 이외의 다른 것을 생각할 수 없습니다 .
i3arnon

2
우리는 모든 구문 설탕이 오래된 프레임 워크 버전을 사용하고 타겟팅 할 수 있다고 말할 수 있다고 생각합니다. 그렇게해도 괜찮습니까?
MBK

4
@mkb 예. 구문 설탕은 프레임 워크 기능이 아닌 컴파일러 기능에만 의존하는 기능입니다.
i3arnon

52

Wikipedia 및 기타 링크를 이해하는 방법에 초점을 맞추고 싶습니다.

Wikipedia에서 C # 6.0이 .NET Framework 4.6과 함께 있다고 말하면 컴파일러 (msc.exe)의 프로덕션 버전이 .NET Framework 4.6 릴리스의 일부가됨을 의미합니다. 이러한 컴파일러는 다중 타겟팅을 통해 더 낮은 버전의 .NET Framework 릴리스를 지원할 수 있습니다. 물론 Roslyn은 오픈 소스 프로젝트가되었으므로 이제 컴파일러는 완전히 개별 구성 요소입니다.

CLR 버전 4.0.30319 (.0)를 참조 할 때 실제로는 .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *) 일 수 있습니다. CLR 버전 4 사양 물론 Xamarin / Mono도 동일한 CLR 사양을 구현합니다.

MSDN 페이지는 아직 완전히 업데이트되지 않았지만 일부 페이지 에는 버전 정보 섹션에 .NET Framework 4.6이 이미 있습니다.

언어 사양 (C # 컴파일러뿐만 아니라), CLR 사양 및 .NET Framework 릴리스는 서로 밀접하게 연결되어 있지 않습니다. 새로운 컴파일러를 사용하여 구형 CLR 및 .NET Framework를 대상으로하는 데 충분한 유연성을 제공합니다.


29

예. 이전 프레임 워크에 최신 컴파일러를 사용하고 새로운 컴파일러 기능에 액세스 할 수 있습니다 (이 기능에 .NET 4.6에 도입 된 새로운 유형이 필요하지 않은 경우).

이것의 다른 예는 C # 4.0 (.NET 4.0)에 기본 매개 변수가 도입 된 방법이지만 .NET 2.0 (C # 2.0) 및 .NET 3.5 (C # 3.0) 프로젝트에서 사용할 수 있습니다.

컴파일러를 행복하게 만들기위한 작은 해결 방법하나만 사용하여 .NET 3.5에 도입 된 특성을 찾을 수있는 경우 .NET 2.0 또는 .NET 3.0에서 확장 메서드 (C # 3.0에 도입 됨)를 사용할 수도 있습니다.


1

빌드 스크립트를 사용하는 경우 새 빌더의 경로를 변경해야합니다.

CPATH = C : \ Program Files (x86) \ MSBuild \ 14.0 \ Bin 설정

[Rebuild.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END

1

의해 답변을 @oobe 실제로 importatnt. C : \ Program Files (x86) \ MSBuild \ 14.0 \ Bin 에서 MSBuild.exe 를 사용한 후에 만 ​​배치 파일을 통해 솔루션을 빌드 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.