259

나는 C #6.0을 사용하여 샘플 프로젝트를 만들었습니다 - 널 전파 및 속성 초기화를 예제로 설정하고 대상 버전 인 .NET 4.0을 설정하면 작동합니다.

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 기능을 사용할 수 있습니까? 제한이나 단점이 있습니까?


  • .Net 버전 2.0 - 3.5는 CLR v2.0을 사용합니다. 최신 버전에서는 CLR v4.0을 사용합니다. - i3arnon
  • 현명한 최적화 : 다음과 같이 각 고양이에 대해 별도의 if-null-check를 추가합니다. - Terence
  • 이럴 수가. 저는 W4F for v4.6을 개발하여 "생각 나게"하고 있습니다. 제작 서버를 2018 년까지 업그레이드 할 필요가 없다는 것을 알았습니다. 한 달에 한 번 작업하면 며칠의 리팩토링이 필요하다고 생각했습니다. 5 분 만에 끝났어. 고맙습니다, 마이크로 소프트! :디 - Eric Wu

5 답변


277

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

예를 들어 이전 버전의 .Net에서는 C #6.0의 문자열 보간 기능을 사용할 수 있지만 (string.Format) :

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

.Net 4.6과 함께 사용해야합니다.IFormattable새로운 프레임 워크 버전 만 추가됨System.FormattableString:

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

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


  • 사실, .Net 4.6은 추가 할 필요가 없습니다. 이전 프레임 워크에 직접 추가 할 수 있습니다.이 코드는 .Net 4.0과 3.5에서 잘 작동합니다. - svick
  • C #6 기능이 .NET 4.0에서 작동하는지 확인할 수있는 목록이 있습니까? 이것을 묻는 또 다른 방법은 다음과 같습니다. 새로운 기능에는 프레임 워크의 지원과 어떤 기능이 필요하지 않습니까? - Rubenisme
  • @Rubenisme 나는 다른 것보다 생각할 수 없다.IFormattable문자열 보간법. - i3arnon
  • 우리는 구문 론적 당분이 이전 프레임 워크 버전을 대상으로 사용될 수 있다고 주장 할 수 있습니다. 그거 괜찮 니? - mkb
  • @mkb 예. 구문 당은 정확히 프레임 워크가 아닌 컴파일러 기능에만 의존하는 기능입니다. - i3arnon

50

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를 사용할 수있는 충분한 유연성을 제공합니다.


28

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

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

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


0

건물 스크립트를 사용하는 경우 경로를 새 작성자로 변경하는 것을 잊지 마십시오.

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


0

@oobe에 의한 응답은 실제로 importatnt입니다. 나는 배치 파일을 통해서만 솔루션을 만들 수 있었다.MSBuild.exe...에서C : \ Program Files (x86) \ MSBuild \ 14.0 \ Bin.

연결된 질문


관련된 질문

최근 질문