2017-08-27 4 views
9

का उपयोग कर निम्नलिखित पर विचार करें, पहली नज़र बेतुका, पैटर्न मैच पर:पैटर्न मिलान में अलग व्यवहार जब वर या स्पष्ट प्रकार

string s = null; 
if (s is string ss) //false 
if (s is string) //false 

दोनों isfalse वापस आ जाएगी। लेकिन अगर हम var का उपयोग व्यवहार को पूरी तरह बदल देता है:

string s = null; 
if (s is var ss) //true!?! 

आप VS2017 में var पर होवर करते हैं, प्रकार string है, लेकिन is के व्यवहार पूरी तरह से अलग है। कंपाइलर कुछ मूल रूप से अलग कर रहा है भले ही अनुमानित प्रकार समान है। यह कैसे हो सकता है? क्या यह एक बग है? null किसी भी तरह से बाहर बुलबुला टाइप करें?

+0

'var ss' नया, शून्य परिवर्तनीय परिभाषित नहीं है? यहां: https://visualstudiomagazine.com/articles/2017/02/01/pattern-matching.aspx आप देख सकते हैं कि यह आवश्यक प्रकार का अस्थायी चर बना रहा है, फिर आप जांच सकते हैं कि स्थिति सही है या नहीं। – sTrenat

+0

@sTrenat ठीक है, और क्यों 'स्ट्रिंग एसएस' नहीं है? – InBetween

+0

मुझे लगता है कि ऑपरेटर 'है' कर रहा है .GetType() और फिर जांच कर रहा है कि टाइप अच्छा है, शून्य के लिए, कोई प्रकार निर्दिष्ट नहीं है, इसलिए यह जांच नहीं सकता है। नए 'var' ऑपरेटर के लिए, यह नया ऑपरेटर के साथ – sTrenat

उत्तर

5

सी # भाषा संदर्भ यह पुष्टि करता है कि व्यवहार का इरादा है।

var पैटर्न के साथ एक पैटर्न मिलान हमेशा सफल होता है। इसके वाक्य रचना

expr is var varname 

कहाँ expr का मूल्य हमेशा एक स्थानीय VARNAME नामित चर को असाइन किया गया है। varname एक ही प्रकार के स्थिर चर के रूप में expr है।

ध्यान दें कि अगर expr शून्य है, तो अभिव्यक्ति अभी भी सत्य है और varname को शून्य निर्दिष्ट करती है।

Source: MSDN - C# Language Reference


var पैटर्न

वर पैटर्न सिर्फ प्रतियां एक नया नाम दिया चर में स्रोत चर है जिसे आप के साथ एक मामले ब्लॉक अभिव्यक्ति का निर्माण कर सकते की तरह नीचे

string s = null; 
var collection = new string[] { "abb", "abd", "abc", null}; 

switch (s) 
{ 
    case "xyz": 
     Console.WriteLine("Is xyz"); 
     break; 

    case var ss when (collection).Contains(s): 
     Console.WriteLine("Is in list"); 
     break; 

    default: 
     Console.WriteLine("Failed!"); 
     break; 

} 

आउटपुट:

> Is in list 
+0

यह वीबी से कॉपी की गई है। उदाहरण के लिए आप अब उपयोग कर सकते हैं: स्विच (आयु) { केस 50: आयुब्लॉक = "बड़ा पांच-ओह"; ब्रेक; केस var testAge जब (नई सूची () {80, 81, 82, 83, 84, 85, 86, 87, 88, 89}) शामिल हैं (testAge): आयुब्लॉक = "ऑक्टोजनियन"; ब्रेक; केस var testAge जब ((testAge> = 90) और (testAge <= 99)): आयुब्लॉक = "nonagenarian"; ब्रेक; केस var testAge जब (testAge> = 100): आयुब्लॉक = "शताब्दी"; ब्रेक; डिफ़ॉल्ट: आयुब्लॉक = "बस पुराना"; ब्रेक; } या, के लिए अगर statemant अगर – sTrenat

+0

(रों वर एस एस, जब एस एस! = रिक्त है), लेकिन मैं अब नहीं है, अगर वहाँ में अगर() – sTrenat

+0

यह सही है, वहाँ वास्तव में नहीं होगा कोई भी उपयोगी मामला है 'if' कथन में इसका कोई उपयोग। –

संबंधित मुद्दे