वर्मप्रेम के साथ ट्रायपार्स


93

C # 6.0 में एक नई सुविधा TryParse विधि के अंदर परिवर्तनशील घोषित करने की अनुमति देती है। मेरे पास कुछ कोड हैं:

string s = "Hello";

if (int.TryParse(s, out var result))
{

}

लेकिन मुझे संकलित त्रुटियाँ प्राप्त होती हैं: यहां छवि विवरण दर्ज करें

क्या मैं गलत हूं? पुनश्च: परियोजना सेटिंग्स में सी # 6.0 और .NET फ्रेमवर्क 4.6 सेट हैं।

जवाबों:


152

C # 6.0 में एक नई सुविधा TryParse विधि के अंदर परिवर्तनशील घोषित करने की अनुमति देती है।

घोषणा के भाव को C # 6.0 से काट दिया गया था और अंतिम रिलीज में नहीं भेजा गया था। आप वर्तमान में ऐसा नहीं कर सकते। GHHub पर C # 7 के लिए इसका प्रस्ताव है ( भविष्य में संदर्भ के लिए इसे देखें )।

अपडेट (07/03/2017)

C # 7 की आधिकारिक रिलीज़ के साथ, निम्नलिखित कोड संकलित करता है:

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}

4
जानकारी के लिए बहुत बहुत धन्यवाद! यह एक छोटी बात है कि यह अंतिम रिलीज से कट गया था, क्योंकि मेरे लिए यह एक अच्छी विशेषता है।
एंटोन 23

2
@ एंटोन 23 चलो आशा करते हैं कि यह C # 7 में हो जाता है :)
युवल इट्ज़चकोव

2
मेरे लिए यह सबसे अधिक अपेक्षित फीचर था।
तुईन फाम

यह C # 7 / VS2017 में है, कम से कम।
सिस्मिथ

1
आप सचमुच, एक और वाक्य पर नहीं पढ़ सकते थे? उत्तर, जो सी # 7 को बताता है, यह भी बताता है कि यह 6.0 से काट दिया गया था। लोग अभी भी C # 6.0
Fus Ro Dah


9

यह C # 7 की एक नई विशेषता है, जो पैटर्न मिलान के साथ संयोजन में अक्सर उपयोग की जाने वाली एक बहुत अच्छी सुविधा है। यह सुविधा, और कई और अधिक, C # 7.0 में C # टीम ब्लॉग व्हाट्स न्यू में घोषित किए गए हैं ।

टीम जिस चीज को हासिल करने की कोशिश करती है, वह है अधिक तरल पदार्थ कोड। क्या आपको कुछ ऐसे मामले याद हैं, जहां बिना किसी उपयोग के बहुत से लंबे समय तक वेरिएबल की सूची बहुत लंबी होती जा रही है। बस एक त्वरित उदाहरण:

int i;
Guid g;
DateTime d;
if (int.TryParse(o, out i)) { /*use i*/ }
else if (Guid.TryParse(o, out g)) { /*use g*/ }
else if (DateTime.TryParse(o, out d)) { /*use d*/ }

समस्या देखें? यह बेकार है उन सभी चर वहाँ बैठे कुछ भी नहीं कर रहे हैं। सी # 7 का उपयोग करके लाइनों की संख्या को आधे में काटा जा सकता है:

if (int.TryParse(o, out int i)) { /*use i*/ }
else if (Guid.TryParse(o, out Guid g)) { /*use g*/ }
else if (DateTime.TryParse(o, out DateTime d)) { /*use d*/ }

न केवल लाइनों की संख्या कम से कम होती है, बल्कि उन क्षेत्रों में चर की कोई अनावश्यक सूची भी नहीं होती है जहां आप उन्हें नहीं रखना चाहते हैं। यह आपको एक वैरिएबल का उपयोग करने से रोकता है जिसका आपने उपयोग करने का इरादा नहीं किया था, लेकिन जो अब आपको दिखाई दे रहा है।

यह फीचर switchस्टेटमेंट में पैटर्न मिलान के साथ भी उपयोगी है , जैसे कि इस कोड में (जो उपरोक्त कोड की तुलना में एक अलग व्यवहार है!)।

switch (o)
{
    case int i: { /*use i*/ break; }
    case Guid g: { /*use g*/ break; }
    case DateTime d: { /*use d*/ break; }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.