क्या C # 8 .NET फ्रेमवर्क का समर्थन करता है?


131

Visual Studio 2019 एडवांस्ड बिल्ड सेटिंग्स में, C # 8 एक .NET फ्रेमवर्क प्रोजेक्ट के लिए उपलब्ध नहीं होता है, केवल (नीचे की तस्वीर के रूप में) .NET कोर 3.0 प्रोजेक्ट के लिए:

यहां छवि विवरण दर्ज करें

क्या C # 8 .NET फ्रेमवर्क का समर्थन करता है?

जवाबों:


238

हां, C # 8 का उपयोग .NET फ्रेमवर्क और विज़ुअल स्टूडियो 2019 में .NET कोर 3.0 / .NET मानक 2.1 से अधिक पुराने लक्ष्यों के साथ किया जा सकता है (या यदि आप Nuget पैकेज स्थापित करते हैं तो Visual Studio के पुराने संस्करण )।

भाषा संस्करण को 8.0csproj फ़ाइल में सेट किया जाना चाहिए ।

अधिकांश - लेकिन सभी नहीं - सुविधाएँ उपलब्ध हैं, जो भी फ्रेमवर्क लक्षित है।


सुविधाएँ जो काम करती हैं

निम्नलिखित विशेषताएं केवल सिंटैक्स परिवर्तन हैं; वे ढांचे की परवाह किए बिना काम करते हैं:

सुविधाएँ जो काम करने के लिए बनाई जा सकती हैं

इन्हें नए प्रकारों की आवश्यकता होती है जो .NET फ्रेमवर्क में नहीं हैं। वे केवल "पॉलीफ़िल" नगेट पैकेज या कोड फ़ाइलों के संयोजन में उपयोग किया जा सकता है:

डिफ़ॉल्ट इंटरफ़ेस सदस्य - काम नहीं करते

डिफ़ॉल्ट इंटरफ़ेस सदस्य .NET फ्रेमवर्क के तहत संकलन नहीं करेंगे और कभी काम नहीं करेंगे क्योंकि उन्हें CLR में रनटाइम परिवर्तन की आवश्यकता होती है। .NET CLR अब जमे हुए है। .NET कोर अब आगे बढ़ने का रास्ता है।

क्या करता है और क्या काम नहीं करता है, और संभव पॉलीफ़िल पर अधिक जानकारी के लिए, स्टुअर्ट लैंग का लेख, सी # 8.0 और .NET स्टैंडर्ड 2.0 - असमर्थित चीजें देखें


कोड

निम्न C # प्रोजेक्ट .NET फ्रेमवर्क 4.8 को लक्षित कर रहा है और दृश्य स्टूडियो 16.2.0 में C # 8 अशक्त संदर्भ प्रकारों का उपयोग करता है। मैंने इसे .NET मानक क्लास लाइब्रेरी टेम्प्लेट चुनकर बनाया है और फिर इसे .NET फ्रेमवर्क को लक्षित करने के लिए संपादित किया है:

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

मैंने तब एक .NET फ्रेमवर्क 4.5.2 WinForms प्रोजेक्ट की कोशिश की, जो एक विरासत .csprojप्रारूप का उपयोग कर रहा था , और उसी अशक्त संदर्भ प्रकार की संपत्ति को जोड़ा। मैंने latestप्रोजेक्ट प्रकार में दृश्य स्टूडियो एडवांस्ड बिल्ड सेटिंग्स डायलॉग (16.3 में अक्षम) में भाषा को बदल दिया और सहेज लिया। बेशक इस बिंदु के रूप में यह निर्माण नहीं करता है। मैं किसी पाठ संपादक में प्रोजेक्ट फाइल खोली और बदल latestकरने के लिए previewनिर्माण विन्यास में PropertyGroup:

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

फिर मैंने <Nullable>enable</Nullable>मुख्य में जोड़कर अशक्त संदर्भ प्रकारों के लिए समर्थन सक्षम किया PropertyGroup:

<PropertyGroup>
   <Nullable>enable</Nullable>

मैंने प्रोजेक्ट को फिर से लोड किया, और यह बनाता है।


गौरी का विवरण

जब यह उत्तर पहली बार लिखा गया था, C # 8 पूर्वावलोकन में था और बहुत सारे जासूसी कार्य शामिल थे। मैं उस जानकारी को यहां पोस्टीरिटी के लिए छोड़ देता हूं। यदि आपको सभी गौरी विवरणों को जानने की आवश्यकता नहीं है, तो इसे छोड़ दें।

C # भाषा ऐतिहासिक रूप से ज्यादातर फ्रेमवर्क न्यूट्रल रही है - यानी फ्रेमवर्क के पुराने संस्करणों को संकलित करने में सक्षम - हालांकि कुछ सुविधाओं के लिए नए प्रकार या सीएलआर समर्थन की आवश्यकता होती है।

अधिकांश C # उत्साही लोगों ने मैड्स टॉर्गेसेन द्वारा ब्लॉग प्रविष्टि बिल्डिंग C # 8.0 पढ़ा होगा , जो बताता है कि C # 8 की कुछ विशेषताओं में प्लेटफ़ॉर्म निर्भरताएँ हैं:

Async स्ट्रीम, इंडेक्सर्स और रेंज सभी नए फ्रेमवर्क प्रकारों पर भरोसा करते हैं जो .NET मानक 2.1 का हिस्सा होंगे। .NET कोर 3.0 के साथ-साथ Xamarin, यूनिटी और मोनो सभी .NET .NET 2.1 को लागू करेंगे, लेकिन .NET फ्रेमवर्क 4.8 होगा नहीं। इसका मतलब है कि इन सुविधाओं का उपयोग करने के लिए आवश्यक प्रकार .NET फ्रेमवर्क 4.8 पर उपलब्ध नहीं होंगे।

यह थोड़ा सा Tuples जैसा लगता है जो C # 7 में पेश किए गए थे। उस फीचर के लिए नए प्रकारों की आवश्यकता थी - ValueTupleसंरचनाएं - जो कि नेट फ्रेमवर्क संस्करणों में नीचे 4.7 या .NET मानक 2.0 से अधिक पुरानी में उपलब्ध नहीं थीं। हालाँकि , C # 7 का उपयोग अभी भी .NET के पुराने संस्करणों में किया जा सकता है, या तो बिना सिस्टम ट्यूपल या उनके साथ System.ValueTuple Nuget पैकेज स्थापित करके । विजुअल स्टूडियो ने इसे समझा और दुनिया के साथ सब ठीक था।

हालाँकि, मैड्स ने यह भी लिखा:

इस कारण से, C # 8.0 का उपयोग केवल उन प्लेटफार्मों पर समर्थित है जो .NET मानक 2.1 को लागू करते हैं।

... जो सच है अगर .NET फ्रेमवर्क के किसी भी संस्करण के साथ C # 8 का उपयोग करने से इनकार किया होगा , और वास्तव में .NET मानक 2.0 पुस्तकालयों में भी, जो हाल ही में हमें पुस्तकालय कोड के लिए आधारभूत लक्ष्य के रूप में उपयोग करने के लिए प्रोत्साहित किया गया था। आप इसे 3.0 से अधिक पुराने .NET कोर संस्करणों के साथ भी उपयोग नहीं कर पाएंगे क्योंकि वे भी केवल .NET मानक 2.0 का समर्थन करते हैं।

जांच जारी थी! -

  • जॉन स्कीट के पास Noda-Time का एक अल्फा संस्करण है जो C # 8 का उपयोग करने के लिए तैयार है जो केवल .NET मानक 2.0 को लक्षित करता है। वह .NET परिवार में सभी रूपरेखाओं का समर्थन करने के लिए C # 8 / .NET मानक 2.0 की स्पष्ट रूप से उम्मीद कर रहा है। (जॉन के ब्लॉग पोस्ट "अशक्त संदर्भ प्रकारों के साथ पहला कदम" भी देखें )।

  • Microsoft कर्मचारी GitHub पर C # 8 अशक्त संदर्भ प्रकारों के लिए Visual Studio UI पर चर्चा कर रहे हैं , और यह कहा जाता है कि वे विरासत csproj(पूर्व- Core Core SDK प्रारूप csproj) का समर्थन करना चाहते हैं । यह एक बहुत मजबूत संकेत है कि C # 8 .NET फ्रेमवर्क के साथ प्रयोग करने योग्य होगा। [मुझे संदेह है कि वे इस पर अब पीछे हटेंगे कि विजुअल स्टूडियो 2019 भाषा संस्करण ड्रॉपडाउन अक्षम कर दिया गया है और .NET को C # के साथ जोड़ दिया गया है]

  • प्रसिद्ध ब्लॉग पोस्ट के तुरंत बाद, GitHub थ्रेड ने क्रॉस-प्लेटफ़ॉर्म समर्थन पर चर्चा की। एक महत्वपूर्ण बिंदु जो उभरा था कि .NET मानक 2.1 में एक मार्कर शामिल होगा जो यह बताता है कि इंटरफेस के डिफ़ॉल्ट कार्यान्वयन का समर्थन किया गया है - इस सुविधा के लिए CLR परिवर्तन की आवश्यकता होती है जो कभी भी .NET फ्रेमवर्क में उपलब्ध नहीं होगी। यहाँ Microsoft पर .NET टीम के प्रोग्राम मैनेजर, Immo Landwerth से महत्वपूर्ण बिट है:

    कंपाइलर्स (जैसे कि C #) से इस क्षेत्र की उपस्थिति का उपयोग करने का निर्णय लिया जाता है ताकि तय किया जा सके कि डिफ़ॉल्ट इंटरफ़ेस कार्यान्वयन की अनुमति है या नहीं। यदि फ़ील्ड मौजूद है, तो रनटाइम परिणाम कोड को लोड और निष्पादित करने में सक्षम होने की उम्मीद है।

  • यह सभी "C # 8.0 को केवल प्लेटफ़ॉर्म पर समर्थित है जो .NET मानक 2.1 को लागू करता है" एक ओवरसिम्प्लीफिकेशन होने के नाते, और यह कि C # 8 .NET फ्रेमवर्क का समर्थन करेगा, लेकिन जैसा कि बहुत अनिश्चितता है, मैंने GitHub और Haloour के उत्तर पर पूछा :

    IIRC, एकमात्र सुविधा जो निश्चित रूप से .NET फ्रेमवर्क पर दिखाई नहीं देगी, वह है DIM (डिफ़ॉल्ट इंटरफ़ेस मेथड) क्योंकि रनटाइम परिवर्तन की आवश्यकता होती है। अन्य सुविधाओं को उन वर्गों के आकार द्वारा संचालित किया जाता है जिन्हें कभी भी .NET फ्रेमवर्क में नहीं जोड़ा जा सकता है, लेकिन अपने स्वयं के कोड या NuGet (श्रेणियों, अनुक्रमित, async पुनरावृत्तियों, async निपटान) के माध्यम से पॉलीफ़िल किया जा सकता है।

  • विक्टर डर्क्स ने टिप्पणी की कि " अधिक जटिल अशक्त उपयोग के मामलों को डिजाइन करने के लिए आवश्यक नई अशक्त विशेषताएँ केवल System.Runtime.dll में उपलब्ध हैं। .NET कोर 3.0 और .NET मानक 2.1 के साथ जहाज ... [और] .NET फ्रेमवर्क के साथ असंगत 4.8 "

  • हालांकि, इम्मो लैंडवर्थ ने टिप्पणी की कि "हमारे एपीआई के विशाल बहुमत को किसी भी कस्टम विशेषताओं की आवश्यकता नहीं थी क्योंकि लेख के तहत प्रकार पूरी तरह से सामान्य या शून्य हैं" अशक्त संदर्भ प्रकार आज़माएं

  • बेन हॉल ने GitHub पर Core 3.0 से बाहर की अशक्त विशेषताओं की उपलब्धता का मुद्दा उठाया , जिसमें Microsoft कर्मचारियों के नोट के निम्नलिखित टिप्पणियां हैं:

C # 8 को पूरी तरह से .net core 3.0 और .net standard 2.1 पर ही सपोर्ट किया जाएगा। यदि आप मैन्युअल रूप से। # कोर 2.1 के साथ C # 8 का उपयोग करने के लिए प्रोजेक्ट फ़ाइल को संपादित करते हैं, तो आप असमर्थित क्षेत्र में हैं। कुछ C # 8 सुविधाएँ अच्छी तरह से काम करने के लिए होंगी, कुछ C # 8 सुविधाएँ बहुत अच्छी तरह से काम नहीं करेंगी (जैसे खराब प्रदर्शन), कुछ C # 8 सुविधाएँ अतिरिक्त हैक के साथ काम करेंगी, और कुछ C # 8 सुविधाएँ बिल्कुल भी काम नहीं करेंगी। समझाने के लिए बहुत जटिल। हम इसे सक्रिय रूप से अवरुद्ध नहीं करते हैं, इसलिए विशेषज्ञ उपयोगकर्ता जो इसके माध्यम से नेविगेट कर सकते हैं, वे ऐसा कर सकते हैं। मैं इस असमर्थित मिश्रण और मिलान का व्यापक रूप से उपयोग करने की अनुशंसा नहीं करूंगा।

(जन कोटस)

आप जैसे लोग जो समझने को तैयार हैं - और उनके आस-पास काम करते हैं - सी # 8 का उपयोग करने के लिए स्वतंत्र हैं। बिंदु यह है कि सभी भाषा सुविधाएँ डाउन-लेवल लक्ष्य पर काम नहीं करेंगी।

(इममो लैंडवर्थ)


विजुअल स्टूडियो 2019

विजुअल स्टूडियो 2019 संस्करण 16.3 के आरटीएम संस्करण में एक बड़ा बदलाव आया है - सी # 8.0 के लिए लॉन्च संस्करण: भाषा चयन ड्रॉपडाउन को अक्षम कर दिया गया है:

यहां छवि विवरण दर्ज करें

इसके लिए Microsoft का तर्क है:

आगे बढ़ते हुए, ... प्रत्येक फ्रेमवर्क के प्रत्येक संस्करण में एक समर्थित और डिफ़ॉल्ट संस्करण होगा, और हम मनमाने संस्करणों का समर्थन नहीं करेंगे। समर्थन में इस परिवर्तन को प्रतिबिंबित करने के लिए, यह प्रतिबद्ध भाषा संस्करण कॉम्बो बॉक्स को स्थायी रूप से निष्क्रिय कर देता है और परिवर्तन को बताते हुए एक दस्तावेज़ में लिंक जोड़ता है।

जो दस्तावेज़ खोलता है वह C # भाषा संस्करण है । यह केवल .NET Core 3.x के लिए डिफ़ॉल्ट भाषा के रूप में C # 8.0 को सूचीबद्ध करता है। यह भी पुष्टि करता है कि आगे बढ़ने वाले प्रत्येक फ्रेमवर्क के प्रत्येक संस्करण में एक समर्थित और डिफ़ॉल्ट संस्करण होगा और यह कि भाषा का ढांचा-अज्ञेयवाद अब उस पर निर्भर नहीं रह सकता है।

.Csproj फ़ाइल को संपादित करके .NET फ्रेमवर्क परियोजनाओं के लिए भाषा संस्करण को अभी भी 8 के लिए मजबूर किया जा सकता है।


कैवियट खाली करनेवाला

C # 8 / .NET फ्रेमवर्क संयोजन आधिकारिक तौर पर Microsoft द्वारा समर्थित नहीं है। यह है, वे कहते हैं, केवल विशेषज्ञों के लिए।


3
इस तथ्य से किसी भी भ्रम को स्पष्ट करना चाहिए जो हम कर सकते हैं, यदि हम कोशिश करते हैं, तो मानक 2.1 के बाहर कुछ सी # 8 सुविधाओं का उपयोग करें - github.com/dotnet/corefx/issues/40039
बेन हॉल

2
अधिक जटिल nullable उपयोग के मामलों को डिजाइन करने के लिए आवश्यक नए nullable विशेषताएँ ( docs.microsoft.com/en-us/dotnet/csharp/nullable-attributes ) केवल System.Runtime.dll में उपलब्ध हैं जो .NET कोर 3.0 और जहाजों के लिए उपलब्ध हैं। नेट मानक 2.1। यह nullable \ C # 8.0 के साथ असंगत है, NET फ्रेमवर्क 4.8
विक्टर डर्क्स

3
@BenHall मैंने आपके मुद्दे से कुछ takeaways जोड़ा है - इस मुद्दे को उठाने और यहां पोस्ट करने के लिए बहुत-बहुत धन्यवाद। यदि यह किसी भी तरह से गलत है तो कृपया उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें।
स्टीफन कैनेडी

3
Visual Studio 2019 IntelliSense द्वारा निर्दिष्ट किए जाने पर अशक्त संदर्भ प्रकारों का समर्थन नहीं करता <Nullable>enable</Nullable>है csproj#nullable enableनिर्देशों का उपयोग करते समय यह काम करने लगता है । इसे भी देखें: github.com/dotnet/project-system/issues/5551
Bouke

3
@odalet मेरे पास C # 8 को लक्षित करने और पॉलीफ़िल्स (पहले से ही ऐसा करने वाले) की आवश्यकता नहीं है, और संभवतः पॉलीफ़िल के साथ भी (उन्हें ज़रूरत नहीं है) का उपयोग करने के लिए कोई योग्यता नहीं होगी। हालाँकि, मेरी सबसे अच्छी सलाह यह हो सकती है: यदि संदेह है, तो ऐसा न करें, कम से कम नहीं तो अगर आपकी नौकरी इस पर निर्भर है।
स्टीफन कैनेडी

34

इस ब्लॉग प्रविष्टि के अनुसार भाषा वास्तव में ढांचे से जुड़ी है:

इसका मतलब है कि इन सुविधाओं का उपयोग करने के लिए आवश्यक प्रकार .NET फ्रेमवर्क 4.8 पर उपलब्ध नहीं होंगे। इसी तरह, डिफ़ॉल्ट इंटरफ़ेस सदस्य कार्यान्वयन नए रनटाइम एन्हांसमेंट पर निर्भर करते हैं, और हम .NET रनटाइम 4.8 में भी नहीं बनाएंगे।

इस कारण से, C # 8.0 का उपयोग केवल उन प्लेटफार्मों पर समर्थित है जो .NET मानक 2.1 को लागू करते हैं। रनटाइम को स्थिर रखने की आवश्यकता ने हमें एक दशक से अधिक समय तक इसमें नई भाषा की विशेषताओं को लागू करने से रोका है। आधुनिक रनटाइम्स के साइड-बाय-साइड और ओपन-सोर्स प्रकृति के साथ, हमें लगता है कि हम जिम्मेदारी से उन्हें फिर से विकसित कर सकते हैं, और उसी के साथ भाषा डिजाइन भी कर सकते हैं। स्कॉट ने .NET कोर 3.0 और .NET फ्रेमवर्क 4.8 पर अपने अपडेट में बताया कि .NET फ्रेमवर्क भविष्य में स्थिरता और विश्वसनीयता पर ध्यान देने के बजाय कम नवाचार देखने जा रहा है। यह देखते हुए, हमें लगता है कि इसके लिए बेहतर है कि कुछ भाषा सुविधाओं को याद न करें क्योंकि उन्हें प्राप्त करने के लिए कोई नहीं है।


3
स्टीफन कैनेडी द्वारा अन्य उत्तर में कई और विवरण। वास्तव में, .NET फ्रेमवर्क को लक्षित करते समय C # 8.0 कार्य का एक पर्याप्त सबसेट बनाना आसान है। लेकिन C # 8.0 के कुछ हिस्सों को उस रनटाइम में बदलाव की आवश्यकता होती है जो Microsoft "पुराने" .NET फ्रेमवर्क के लिए नहीं करने वाला है। और वे भाषा संस्करण और .NET संस्करण को एक साथ अधिक बारीकी से बांधते हुए प्रतीत होते हैं।
जेपी स्टिग नीलसन

1

C # 8.0 (और उच्चतर) केवल .NET कोर 3.x और नए संस्करणों पर समर्थित है। नवीनतम सुविधाओं में से कई में .NET कोर 3.x: C # भाषा संस्करण में पेश की गई लाइब्रेरी और रनटाइम सुविधाओं की आवश्यकता होती है


2
क्या आपने @stephen kennedy के ऊपर से चिह्नित-जैसा-सही उत्तर देखा है?
जेम्स हरकोर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.