2017-11-30 16 views
8

सी # कोड का एक टुकड़ावीएस डीबग मुद्दा, जो मुझे नीचे यह बताने में मदद कर सकता है?

var isTrue = (new List<int>{1,2,3} is IEnumerable<object>); 

मैं कोड निष्पादन, में परिणाम false मिला लेकिन जब मैं कॉपी कि वॉच विंडो में कोड, परिणाम true है।

+1

मुझे लगता है कि 'आईन्यूमेबल' एक टाइपो है? – casiosmu

+0

[संभावित और कॉन्ट्रा-वेरिएंस के बीच अंतर] का संभावित डुप्लिकेट (https://stackoverflow.com/questions/2184551/difference-between-covariance-contra-variance) –

+0

टीएल; डीआर: एक 'सूची ' एक 'IENumerable है 'लेकिन' inumerable 'नहीं। 'झूठा' सही परिणाम है। –

उत्तर

0

यह एक पूर्ण उत्तर नहीं है (मुझे यह कारण नहीं पता कि यह बग क्यों उग रहा है), लेकिन यह डीबगर के अनियमित व्यवहार पर कुछ प्रकाश डालता है जो स्पष्ट रूप से छोटी है।

पहला और सबसे महत्वपूर्ण: सी # अस्वीकार (और AFAIK, सीएलआर भी) प्रकार भिन्नता मूल्य प्रकार शामिल हैं; अगर वहाँ एक पहचान शामिल प्रकार के बीच रूपांतरण संरक्षण है विचरण केवल अनुमति दी है, अन्यथा यह विफल हो जाएगा (कोई पहचान मूल्य प्रकार के लिए रूपांतरण संरक्षण है):

object[] oo = new int[] {1, 2, 3}; //will fail 
IEnumerable<object> oo = new int[] {1, 2, 3}; //will fail 

डिबगर के तत्काल खिड़की स्पष्ट रूप से गलत है, new List<int> { 1, 2, 3 } is IEnumerable<object> लौटना चाहिए रनटाइम के रूप में false करता है। यह true क्यों लौट रहा है? क्योंकि एक बग, अवधि है।

क्या यह और भी विस्मयकारी बनाता है तथ्य यह है कि new int[] { 1, 2, 3 } is IEnumerable<object> correclty वापस आ जाएगी false जब int[] परोक्ष IEnumerable<int>List<int> के रूप में ही करने के लिए परिवर्तनीय है।

एकमात्र कारण मैं बाद सही व्यवहार के लिए लगता है कि संकलक पहले से ही झंडे कि अभिव्यक्ति के रूप में हमेशा false एक चेतावनी है और इसलिए जिस तरह से साथ संकलक सरणी परिदृश्य का विश्लेषण करती है किसी अन्य IEnumerable से अलग है।

+0

हां, आईडीई विंडो में एक संदिग्ध प्रकार की चेतावनी है। आपके शब्दों में, अनियमित कुंजी तत्व है –

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