2015-03-08 16 views
237

Stworzyłem przykładowy projekt, z dodatkami C# 6.0 - propagacja pustej i inicjowanie właściwości jako przykładu, ustaw docelową wersję .NET 4.0 i ... działa.Czy C# 6.0 działa dla .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); 
    } 
} 

Czy to oznacza, że ​​mogę używać funkcji C# 6.0 w moim oprogramowaniu, które kieruje do .NET 4.0? Czy są jakieś ograniczenia lub wady?

+6

. Wersje Netto 2.0 - 3.5 używają CLR v2.0. Nowsze wersje używają CLR v4.0. – i3arnon

+0

miej na uwadze, że, optymalizuj mądrość: dodajesz osobny sprawdzian typu "null" dla każdego kota, tak jak ten – Terence

+2

Mój Boże. Opracowuję kierowanie WCF w wersji 4.6, aby "przypomnieć", że serwer produkcyjny nie zostanie zaktualizowany do 2018 roku. Myślałem, że praca za miesiąc wymagać będzie kilku dni refaktoryzacji. Ukończony w pięć minut. Dziękuję, Microsoft! : D –

Odpowiedz

253

Tak (głównie). C# 6.0 wymaga nowego kompilatora Roslyn, ale nowy kompilator może kompilować starsze wersje frameworków. Ogranicza się to tylko do nowych funkcji, które nie wymagają obsługi z poziomu.

Na przykład, podczas gdy można skorzystać z funkcji interpolacji smyczkowy C# 6.0 z wcześniejszych wersji .NET (jak to skutkuje wezwaniem do string.Format):

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

Trzeba .Net 4.6 z niego korzystać z IFormattable jak tylko nowa wersja ramy dodaje System.FormattableString:

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

przypadki, które wymieniłeś nie trzeba typy z ram do pracy. Tak więc kompilator jest w stanie w pełni obsługiwać te funkcje dla starych wersji szkieletowych.

+28

W rzeczywistości nie potrzebujesz .Net 4.6, tylko kilka typów, które są dodawane. Możesz je dodać do starszych frameworków. [Ten kod działa poprawnie na .Net 4.0 i 3.5.] (Https://gist.github.com/svick/e5b30f73146a501cc64f) – svick

+8

Czy istnieje lista gdzie można znaleźć funkcje C# 6 działające w .NET 4.0? Innym sposobem na zadawanie takich pytań byłoby: jakie nowe funkcje wymagają wsparcia z ram, a które nie? – Rubenisme

+1

@Rubenisme Nie mogę wymyślić innego niż interpolacja "IFormattable' string". – i3arnon

26

Tak, możesz użyć nowszych kompilatorów dla starszych frameworków i uzyskać dostęp do nowych funkcji kompilatora (o ile te funkcje nie wymagają nowych typów wprowadzonych w .NET 4.6).

Innymi przykładami są metody z domyślnymi parametrami wprowadzonymi przy pomocy C# 4.0 (.NET 4.0), ale można ich używać w projektach .NET 2.0 (C# 2.0) i .NET 3.5 (C# 3.0).

Można również użyć metod rozszerzeń (wprowadzonych w C# 3.0) w .NET 2.0 lub .NET 3.0 if you do one small workaround, aby kompilator był szczęśliwy, aby mógł znaleźć atrybut wprowadzony w .NET 3.5.

45

Po prostu skup się na tym, jak zrozumieć Wikipedię i inne linki.

Gdy Wikipedia mówi, że C# 6.0 jest z .NET Framework 4.6, oznacza to, że wersja produkcyjna kompilatora (msc.exe) będzie częścią wydania .NET Framework 4.6. Za pomocą multi-targeting takie kompilatory mogą obsługiwać niższe wersje .NET Framework. Oczywiście, ponieważ Roslyn stała się projektem open source, kompilator jest teraz całkowicie indywidualnym składnikiem.

Gdy coś odnosi się do wersji CLR 4.0.30319 (.0), może to być .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Ponieważ wszystkie implementują specyfikację CLR w wersji 4. Nie wspominając o Xamarin/Mono również implementują tę samą specyfikację CLR.

Strona MSDN nie jest jeszcze w pełni zaktualizowana, ale program some page ma już .NET Framework 4.6 wymieniony w sekcji Informacje o wersji.

We wszystkich specyfikacjach językowych (a także kompilatorze C#) specyfikacje CLR i wydania .NET Framework nie są ze sobą ściśle powiązane. Daje to programistom wystarczającą elastyczność, aby wykorzystać nowe kompilatory do kierowania starszych CLR i .NET Framework.

0

Jeśli używasz ascripts budowlanych pamiętać, aby zmienić ścieżkę do nowego budowniczego:

zestaw 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