क्या .NET 4.0 के लिए C # 6.0 काम करता है?


275

मैंने एक नमूना परियोजना बनाई, जिसमें 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);
    }
}

क्या इसका मतलब है कि मैं अपने सॉफ़्टवेयर के लिए C # 6.0 सुविधाओं का उपयोग कर सकता हूं जो .NET 4.0 को लक्षित करता है? क्या कोई सीमाएं या कमियां हैं?


7
.Net संस्करण 2.0 - 3.5 सीएलआर v2.0 का उपयोग करते हैं। नए संस्करण CLR v4.0 का उपयोग करते हैं।
i3arnon

ध्यान रखें कि, बुद्धिमानी का अनुकूलन करें: आप इस तरह से प्रत्येक बिल्ली के लिए एक अलग if-null-check जोड़ रहे हैं
Terence

2
हे भगवान। मैं एक WCF लक्ष्यीकरण v4.6 विकसित कर रहा हूँ बस "याद दिलाने" के लिए कि उत्पादन सर्वर को 2018 तक अपग्रेड नहीं किया जाना है। मैंने सोचा कि एक महीने के लायक काम के लिए कुछ दिनों के रिफैक्टरिंग की आवश्यकता होगी। पाँच मिनट में समाप्त हो गया। धन्यवाद, Microsoft! : डी
एरिक वू

जवाबों:


286

हाँ (अधिकतर)। सी # 6.0 को नए रोसलिन कंपाइलर की आवश्यकता होती है, लेकिन नया कंपाइलर पुराने फ्रेमवर्क संस्करणों को लक्षित कर सकता है। यह केवल उन नई सुविधाओं तक सीमित है जिन्हें ढांचे से समर्थन की आवश्यकता नहीं है

उदाहरण के लिए, जब आप .Net के पूर्व संस्करणों के साथ C # 6.0 में स्ट्रिंग इंटरपोलेशन सुविधा का उपयोग कर सकते हैं (क्योंकि इससे कॉल में परिणाम होता है string.Format:

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

आपको .Net 4.6 की जरूरत है ताकि इसे IFormattableकेवल नए फ्रेमवर्क संस्करण के साथ उपयोग किया जा सके System.FormattableString:

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

आपके द्वारा उल्लिखित मामलों को कार्य करने के लिए फ्रेमवर्क से प्रकारों की आवश्यकता नहीं है। इसलिए कंपाइलर पुराने ढांचे संस्करणों के लिए इन सुविधाओं का समर्थन करने में पूरी तरह से सक्षम है।


31
वास्तव में, आपको .Net 4.6 की आवश्यकता नहीं है, बस कुछ प्रकार जो इसमें जोड़े जाते हैं। आप उन पुराने ढाँचों में खुद को जोड़ सकते हैं। यह कोड .Net 4.0 और 3.5 पर ठीक काम करता है।
svick

10
क्या कोई सूची है जो यह देखने के लिए कि .NET 4.0 में कौन सी C # 6 सुविधाएँ काम करती हैं? यह पूछने का एक और तरीका होगा: कौन सी नई सुविधाओं को ढांचे से समर्थन की आवश्यकता है और कौन सी नहीं?
रुबेनिज्म

1
@ रूबेनिज़्म मैं IFormattableस्ट्रिंग प्रक्षेप के अलावा एक दूसरे के बारे में नहीं सोच सकता ।
i3arnon

2
मुझे लगता है कि हम कह सकते हैं कि सभी सिंथैटिक शर्करा का उपयोग किया जा सकता है और पुराने ढांचे के संस्करणों को लक्षित किया जा सकता है। क्या यह कहना ठीक है?
mkb

4
@ mkb हाँ। सिंथेटिक शुगर वास्तव में वे विशेषताएं हैं जो केवल संकलक क्षमताओं पर निर्भर करती हैं और फ्रेमवर्क वाले नहीं।
i3arnon

52

सिर्फ विकिपीडिया और अन्य लिंक को समझने के तरीके पर ध्यान देना चाहते हैं।

जब विकिपीडिया कहता है कि C # 6.0 .NET फ्रेमवर्क 4.6 के साथ है, तो इसका मतलब है कि कंपाइलर (msc.exe) का उत्पादन संस्करण .NET फ्रेमवर्क 4.6 रिलीज का हिस्सा होगा। बहु-लक्ष्यीकरण के माध्यम से , ऐसे कंपाइलर .NET फ्रेमवर्क रिलीज़ के निम्न संस्करणों का समर्थन कर सकते हैं। बेशक, जब से रोसलिन एक ओपन सोर्स प्रोजेक्ट बन गया, कंपाइलर अब पूरी तरह से एक व्यक्तिगत घटक है।

जब कुछ सीएलआर संस्करण 4.0.30319 (.0) को संदर्भित करता है, तो यह वास्तव में .NET फ्रेमवर्क 4. * (4.0, 4.0। *, 4.5, 4.5। *, 4.6, 4.6। *) हो सकता है, क्योंकि वे सभी लागू होते हैं। सीएलआर संस्करण 4 विनिर्देश। ज़मारिन / मोनो का उल्लेख नहीं करने के लिए भी उसी सीएलआर विनिर्देश को लागू करें।

MSDN पृष्ठ अभी तक पूरी तरह से अपडेट नहीं हुआ है, लेकिन कुछ पेजों में पहले से ही .NET फ्रेमवर्क 4.6 है जो संस्करण सूचना अनुभाग में सूचीबद्ध है।

सभी में, भाषा चश्मा (साथ ही सी # संकलक), सीएलआर चश्मा और .NET फ्रेमवर्क रिलीज एक दूसरे के साथ कसकर युग्मित नहीं होते हैं। यह पुराने सीएलआर और .NET फ्रेमवर्क को लक्षित करने के लिए नए संकलक का उपयोग करने के लिए डेवलपर्स को पर्याप्त लचीलापन देता है।


29

हां, आप पुराने फ्रेमवर्क के लिए नए कंपाइलरों का उपयोग कर सकते हैं और नए कंपाइलर फीचर्स तक पहुंच प्राप्त कर सकते हैं (जब तक कि उन सुविधाओं को .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 में पेश किया गया था।


1

यदि आप भवन निर्माण का उपयोग कर रहे हैं तो नए बिल्डर के लिए रास्ता बदलना याद रखें:

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

1

@Oobe द्वारा उत्तर वास्तव में importatnt है। मैं C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin से MSBuild.exe का उपयोग करने के बाद ही बैच फ़ाइल के माध्यम से अपना समाधान बना सकता हूं ।

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