Stworzyłem przykładowy projekt z dodatkami C # 6.0 - propagacja zerowa i inicjalizacja właściwości jako przykład, ustaw docelową wersję .NET 4.0 i to ... działa.
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);
}
}
- Wikipedia twierdzi, że .NET Framework dla C # 6.0 to 4.6.
- To pytanie (i test CTP programu Visual Studio 2015 ) mówi, że wersja CLR to 4.0.30319.0.
- Ta strona MSDN mówi, że .NET 4, 4.5, 4.5.2 używa CLR 4. Nie ma żadnych informacji o .NET 4.6.
Czy to oznacza, że mogę używać funkcji C # 6.0 dla mojego oprogramowania, które jest ukierunkowane na .NET 4.0? Czy są jakieś ograniczenia lub wady?
Odpowiedzi:
Tak (głównie). C # 6.0 wymaga nowego kompilatora Roslyn, ale nowy kompilator może kompilować ukierunkowane na starsze wersje frameworka. Jest to ograniczone tylko do nowych funkcji, które nie wymagają wsparcia ze strony frameworka .
Na przykład, chociaż można użyć funkcji interpolacji ciągów w języku C # 6.0 we wcześniejszych wersjach .Net (ponieważ powoduje to wywołanie
string.Format
):Potrzebujesz .Net 4.6, aby używać go,
IFormattable
ponieważ tylko nowa wersja frameworka dodajeSystem.FormattableString
:Wspomniane przypadki nie potrzebują typów z frameworka do działania. Kompilator jest więc w stanie w pełni obsługiwać te funkcje w starszych wersjach frameworka.
źródło
IFormattable
interpolacja łańcuchów.Chcę się skupić na zrozumieniu Wikipedii i innych linków.
Kiedy Wikipedia mówi, że C # 6.0 jest z .NET Framework 4.6, oznacza to po prostu, że wersja produkcyjna kompilatora (msc.exe) będzie częścią wydania .NET Framework 4.6. Dzięki wielu celowaniu takie kompilatory mogą obsługiwać niższe wersje wydań .NET Framework. Oczywiście, odkąd Roslyn stała się projektem open source, kompilator jest teraz całkowicie indywidualnym komponentem.
Gdy coś odnosi się do wersji CLR 4.0.30319 (.0), tak naprawdę może to być .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Ponieważ wszystkie implementują Specyfikacja CLR wersja 4. Nie wspominając już o Xamarin / Mono, które implementują tę samą specyfikację CLR.
Strona MSDN nie jest jeszcze w pełni zaktualizowana, ale niektóre strony mają już .NET Framework 4.6 wymienione w sekcji Informacje o wersji.
Ogólnie rzecz biorąc, specyfikacje językowe (a także kompilator C #), specyfikacje CLR i wersje .NET Framework nie są ze sobą ściśle powiązane. Daje to programistom wystarczającą elastyczność, aby wykorzystywać nowe kompilatory do kierowania do starszych CLR i .NET Framework.
źródło
Tak, możesz używać nowszych kompilatorów dla starszych platform 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 parametrami domyślnymi wprowadzone w 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żesz również używać metod rozszerzeń (wprowadzonych w C # 3.0) w .NET 2.0 lub .NET 3.0, jeśli wykonasz jedno małe obejście, aby uszczęśliwić kompilator, aby mógł znaleźć atrybut, który został wprowadzony w .NET 3.5.
źródło
Jeśli używasz skryptów budowlanych, pamiętaj o zmianie ścieżki do nowego programu budującego:
ustaw CPATH = C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin
[Rebuild.bat]
źródło
Odpowiedź @oobe jest rzeczywiście ważna. Mógłbym zbudować moje rozwiązanie za pomocą pliku wsadowego dopiero po użyciu MSBuild.exe z C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin .
źródło