2013-10-06 13 views
11

के साथ त्वरित रूप से सूचीबद्ध करने के लिए सूची को बदलने में असमर्थ मैं प्रतिबिंब द्वारा एकल आयामी Int32 सरणी के List<T> को तत्काल कर रहा हूं। जब मैं सूची का उपयोग कर का दृष्टांत: सूची <int[*]> सूची सूची

Type typeInt = typeof(System.Int32); 
Type typeIntArray = typeInt.MakeArrayType(1); 
Type typeListGeneric = typeof(System.Collections.Generic.List<>); 
Type typeList = typeListGeneric.MakeGenericType(new Type[] { typeIntArray, }); 

object instance = typeList.GetConstructor(Type.EmptyTypes).Invoke(null); 

मैं सूची पर ही यह अजीब व्यवहार देखें:

Watch of the list instance as an object

अगर मैं प्रतिबिंब के माध्यम से यह साथ इंटरफेस यह सामान्य रूप से व्यवहार करने के लिए लगता है, लेकिन अगर मैं कोशिश इसकी वास्तविक प्रकार के लिए यह कास्ट करने के लिए:

+०१२३५१६४१०६१:

List<int[]> list = (List<int[]>)instance; 

मैं इस अपवाद

'System.Collections.Generic.List`1 [System.Int32 [*]]' टाइप करने के लिए 'System.Collections.Generic.List`1 [System.Int32 []]' टाइप करने में असमर्थ।

कोई विचार क्या हो सकता है या इसे हल करने के लिए क्या हो सकता है? मैं .NET 4.0 पर विजुअल स्टूडियो 2010 एक्सप्रेस में काम कर रहा हूं।

उत्तर

10

समस्या MakeArrayType फ़ंक्शन के कारण होती है। जिस तरह से आप इसका उपयोग कर रहे हैं, आप एक आयाम के साथ एक बहुआयामी सरणी बनाते हैं, जो एक आयामी सरणी (वेक्टर) के समान नहीं है।

documentation से:

आम भाषा क्रम वैक्टर के बीच एक अंतर बना देता है और बहुआयामी सरणियों (जो एक आयामी सरणियों कि हमेशा शून्य आधारित हैं) है। एक वेक्टर, जो हमेशा एक आयाम होता है, एक बहुआयामी सरणी के समान नहीं होता है जो केवल एक आयाम होता है। वे वेक्टर प्रकार बनाने के लिए इस विधि अधिभार का उपयोग नहीं कर सकते हैं; यदि रैंक 1 है, तो यह विधि अधिभार एक बहुआयामी सरणी प्रकार देता है जो एक आयाम होता है। वेक्टर प्रकार बनाने के लिए MakeArrayType() विधि अधिभार का उपयोग करें।

बदलें:

Type typeIntArray = typeInt.MakeArrayType(1); 
इस के लिए

:

Type typeIntArray = typeInt.MakeArrayType(); 

एक साधारण एक आयामी वेक्टर बनाने के लिए।

+0

मुझे उत्सुकता होगी कि यह स्थानीय लोगों को देखते समय अजीब सूची व्यवहार क्यों करता है लेकिन अभी के लिए, यह समस्या हल हो गई है। धन्यवाद। – Einherjar

3

क्या MSDN कहते हैं के बारे में MakeArrayType(int):

आप एक वेक्टर प्रकार बनाने के लिए इस विधि का अधिभार का उपयोग नहीं कर सकते हैं; यदि रैंक 1 है, तो यह विधि अधिभार एक बहुआयामी सरणी प्रकार देता है जो एक आयाम होता है। वेक्टर प्रकार बनाने के लिए MakeArrayType() विधि अधिभार का उपयोग करें।

+0

धन्यवाद, जो [] और [*] के बीच भी मेरे भ्रम का जवाब देता है! – Einherjar

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