Czy C # 8 obsługuje the.NET ramy?

C# 8 nie wydaje się być dostępne dla projektu. NET Framework, tylko (jak na poniższym rysunku) dla projektu. NET Core 3.0:

Tutaj wpisz opis obrazka

Czy C # 8 obsługuje. NET Framework?

Author: Stephen Kennedy, 2019-06-18

3 answers

Tak, C # 8 może być używany z. NET Framework i innymi celami starszymi niż. Net Core 3.0/. NET Standard 2.1 w Visual Studio 2019 (lub starszymi wersjami Visual Studio, Jeśli zainstalujesz pakiet NuGet ).

Jedyną rzeczą wymaganą jest ustawienie wersji językowej na 8.0 w pliku csproj. Przeczytaj poniżej, jak to zrobić w programie Visual Studio 2019 w wersji 16.3 i nowszej.

Większość - ale nie wszystkie-funkcje są dostępne niezależnie od tego, który framework jest "target": {]}


Funkcje, które działają

Następujące funkcje są tylko zmianami składni; działają niezależnie od frameworka:

Funkcje, które mogą być wykonane do pracy

Wymagają one nowych typów, które nie są w. NET Framework. Mogą być używane tylko w połączeniu z pakietami NuGet "polyfill" lub kodem pliki:

Domyślni członkowie interfejsu - nie mogą, nie mogą i nigdy nie będą działać

Domyślni członkowie interfejsu nie będą kompilować się pod. NET Framework i nigdy nie będą działać, ponieważ wymagają zmian w CLR. CLR. NET jest teraz zamrożony, ponieważ. Net Core jest teraz drogą naprzód.

więcej informacji na temat czy i nie działa, a na temat możliwych polyfills, patrz artykuł Stuarta Langa, C # 8.0 i. NET Standard 2.0-Robienie nieobsługiwanych rzeczy .


Kod

Poniższy projekt C# targeting. NET Framework 4.8 i użycie C# 8 nullable reference types kompiluje się w Visual Studio 16.2.0. Stworzyłem go wybierając szablon biblioteki klas. Net Standard, a następnie edytując go do celu. NET Framework zamiast:

.csproj:

<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; }
    }
}

Następnie wypróbowałem projekt. NET Framework 4.5.2 WinForms, używając starszego formatu .csproj i dodałem tę samą właściwość nullable reference type. Zmieniłem Typ języka w oknie dialogowym Visual Studio Advanced Build settings (wyłączony w 16.3) na latest i zapisałem projekt. Oczywiście w tym punkcie nie buduje. Otworzyłem plik projektu w edytorze tekstowym i zmieniłem latest na preview w konfiguracji build PropertyGroup:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
   <LangVersion>preview</LangVersion>

Włączyłem obsługę nullable reference types dodając <Nullable>enable</Nullable> do głównego PropertyGroup:

<PropertyGroup>
   <Nullable>enable</Nullable>

Załadowałem ponownie projekt, a on się buduje.


Visual Studio 2019]} Visual Studio 2019 w wersji 16.3, wersja startowa dla C # 8.0: rozwijane menu wyboru języka zostało wyłączone:]}

Tutaj wpisz opis obrazka

Microsoft uzasadnienie dla tego jest:

Idąc do przodu, ... każda wersja każdego frameworka będzie miała jeden obsługiwana i domyślna wersja, a my nie będziemy obsługiwać dowolnych wersje. Aby odzwierciedlić tę zmianę wsparcia, ten commit trwale wyłącza pole wyboru wersji językowej i dodaje łącze do dokumentu wyjaśniam zmianę.

Otwierający się dokument to wersjonowanie języka C # . C# 8.0 jest domyślnym językiem dla. NET Core 3.tylko X. Potwierdza również, że każda wersja każdego frameworka będzie miała jedną wspieraną i domyślną wersję i nie będzie można już polegać na frameworku-agnostycyzmie języka.

Wersja językowa może być nadal zmuszony do 8 dla projektów. NET Framework poprzez edycję .plik csproj.


Krwawe szczegóły

kiedy ta odpowiedź została napisana po raz pierwszy, C # 8 był w podglądzie i wiele pracy detektywistycznej było zaangażowane. Tę informację zostawiam tutaj dla potomności. Możesz go pominąć, jeśli nie musisz znać wszystkich krwawych szczegółów.

Język C# był historycznie głównie neutralny dla frameworka - tzn. mógł kompilować starsze wersje frameworka - chociaż niektóre funkcje wymagały nowych typów lub obsługi CLR.

Większość entuzjastów C# przeczytała wpis na blogu Building C# 8.0 Madsa Torgersena, który wyjaśnia, że niektóre funkcje C # 8 mają platformę zależności:

Strumienie asynchroniczne, indeksery i zakresy opierają się na nowych typach frameworków to będzie częścią. Net Standard 2.1... . Net Core 3.0 oraz Xamarin, Unity i Mono będą implementować. NET Standard 2.1, ale. NET Framework 4.8 nie będzie. Oznacza to, że typy wymagane do użycia te funkcje nie będą dostępne w. NET Framework 4.8.

To wygląda trochę jak krotki wartości, które zostały wprowadzone w C # 7. Cecha ta wymagała nowych typów - ValueTuple struktury-które nie były dostępne w wersjach Net Framework poniżej 4.7 lub. Net Standard starszych niż 2.0. C # 7 może być używany w starszych wersjach. Net, bez krotek wartości lub z nimi, instalując system .ValueTuple NuGet package . Visual Studio to rozumiało i wszystko było w porządku ze światem.

Mads napisał (a):]}
Z tego powodu używanie C # 8.0 jest obsługiwane tylko na platformach implementujących. NET Standard 2.1.

...co, jeśli prawda, wykluczyłoby używanie C # 8 z dowolną wersją.NET Framework, a nawet w bibliotekach. NET Standard 2.0, które dopiero niedawno zachęcano nas do używania jako podstawowego celu dla kodu biblioteki. Nie byłoby nawet w stanie go używać w wersjach. Net Core starszych niż 3.0, ponieważ również obsługują tylko. NET Standard 2.0.

Śledztwo było prowadzone! -

  • Jon Skeet ma wersję alfa Noda-Time korzystanie z C # 8 ready to go, które dotyczy tylko standardu. NET 2.0. Wyraźnie oczekuje, że C # 8/. NET Standard 2.0 będzie obsługiwał wszystkie frameworki z rodziny. NET. (Zobacz także post na blogu Jona "pierwsze kroki z zerowymi typami referencyjnymi" ).

  • [15]}pracownicy Microsoft omawiali interfejs Visual Studio dla C # 8 nullable reference types na GitHub i stwierdzono, że zamierzają wspierać legacy csproj (pre-.NET Core SDK format csproj). Jest to bardzo silne wskazanie, że C # 8 będzie użyteczny z. NET Framework. [Podejrzewam, że cofną się teraz, gdy rozwijana Wersja Językowa Visual Studio 2019 została wyłączona i. NET został powiązany z C # 7.3]
  • Krótko po słynnym wpisie na blogu, wątek GitHub omówił obsługę wielu platform. Ważnym punktem, który pojawił się było to, że . Net Standard 2.1 będzie zawierać znacznik, który oznacza, że domyślne implementacje interfaces is supported - funkcja wymaga zmiany CLR, która nigdy nie będzie dostępna dla. NET Framework. Oto ważny bit, od Immo Landwerth, menedżer programu w zespole. NET w Microsoft: {]}

Kompilatory (takie jak C#) powinny używać tego pola do decydowania, czy zezwolić na domyślne implementacje interfejsu. Jeśli pole jest obecne, oczekuje się, że runtime będzie w stanie załadować i wykonać wynikowe kod.

    C# 8.0 jest wspierane tylko na platformach implementujących. NET Standard 2.1, co jest uproszczeniem, A C # 8 będzie wspierać. NET Framework, ale ponieważ jest tak wiele niepewności, zapytałem na Githubie i HaloFour odpowiedział:]}

IIRC, jedyną funkcją, która na pewno nie pojawi się na. Net Framework jest DIM (domyślne metody interfejsu), ponieważ wymaga zmian w środowisku uruchomieniowym. Pozostałe funkcje są napędzane przez kształty klas, które mogą nigdy nie być dodawane do. NET Framework, ale mogą być polyfilowane przez własny kod lub NuGet (zakresy, indeksy, Iteratory asynchroniczne, asynchroniczne usuwanie).

  • Victor Derks skomentował, że " nowe atrybuty nullablewymagane do zaprojektowania bardziej złożonych przypadków użycia nullable są dostępne tylko w systemie.Runtime.dll dostarczany z. Net Core 3.0 i. Net Standard 2.1... [i] niezgodny z. NET Framework 4.8"

  • Jednak Immo Landwerth skomentował , że "zdecydowana większość naszych API Nie wymaga żadnych niestandardowych atrybutów, ponieważ typy są w pełni generyczne lub nie-null" w artykule Wypróbuj Nullable Reference Types {20]}
  • Ben Hall poruszył problem dostępności atrybutów nullable poza rdzeniem 3.0 na Githubie, z następującymi uwagami pracowników Microsoft Uwaga:

C # 8 będzie w pełni obsługiwany tylko przez. Net Core 3.0 i. Net standard 2.1. Jeśli ręcznie edytujesz plik projektu, aby używać C # 8 z. Net core 2.1, jesteś na nieobsługiwanym terytorium. Niektóre funkcje C # 8 przydarzą się działa dobrze, niektóre funkcje C # 8 będą działać niezbyt dobrze (np. słabe wydajność), niektóre funkcje C # 8 będą działać z dodatkowymi hackami, a niektóre Funkcje C # 8 w ogóle nie będą działać. Bardzo skomplikowane do wyjaśnienia. My nie aktywnie blokują go więc doświadczeni użytkownicy, którzy może poruszać się po nim może zrób to. Nie polecam tego nieobsługiwanego mix&match do użycia / align = "left" /

(Jan Kotas)

Ludzie tacy jak ty, którzy są chętni zrozumieć - i pracować wokół nich -- są wolne do korzystania z C # 8. Chodzi o to, że nie wszystkie funkcje językowe będą działać na niższych poziomach.

(Immo Landwerth)


Caveat emptor

Połączenie C # 8/. NET Framework nie jest oficjalnie obsługiwane przez Microsoft. Tak mówią., tylko dla ekspertów.
 301
Author: Stephen Kennedy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-03 16:44:37

Zgodnie z ten wpis na blogu Język jest rzeczywiście związany z frameworkiem:

Oznacza to, że typy wymagane do korzystania z tych funkcji nie będą dostępne w.NET Framework 4.8. Podobnie, domyślne implementacje członków interfejsu polegają na nowych ulepszeniach środowiska uruchomieniowego i nie będziemy ich wprowadzać w środowisku uruchomieniowym.NET 4.8.

Z tego powodu używanie C # 8.0 jest obsługiwane tylko na platformach implementujących. NET Standard 2.1. Konieczność utrzymania stabilnego środowiska uruchomieniowego ma przez ponad dekadę nie mogliśmy wdrażać w nim nowych funkcji językowych. Mając na uwadze side-by-side I open-source charakter nowoczesnych środowisk uruchomieniowych, czujemy, że możemy odpowiedzialnie je ponownie rozwijać i projektować język z myślą o tym. Scott wyjaśnił w swojej aktualizacji na. Net Core 3.0 i. NET Framework 4.8, że. NET Framework będzie widzieć mniej innowacji w przyszłości, zamiast skupić się na stabilności i niezawodności. Biorąc to pod uwagę, uważamy, że lepiej jest przegapić jakiś język funkcje niż dla nikogo, aby je dostać.
 32
Author: user1781290,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

C # 8.0 (i wyższe) jest obsługiwane tylko na. Net Core 3.x i nowsze wersje. Wiele najnowszych funkcji wymaga biblioteki i środowiska uruchomieniowego funkcje wprowadzone w. NET Core 3.x: wersjonowanie języka C #

 -1
Author: Zdravko Zdravkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-03 17:45:41