2016-11-30 3 views
5

जब string.Format() विधि के लिए एक तर्क के रूप एक सरणी का उपयोग करने की कोशिश कर रहा है, मैं निम्नलिखित त्रुटि मिलती है:String.Format() के लिए तर्क के रूप में एक सरणी का उपयोग करना

FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

कोड इस प्रकार है के रूप में:

place = new int[] { 1, 2, 3, 4}; 
infoText.text = string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}", place); 

ऐरे में चार मान होते हैं और String.Format() में तर्क भी समान हैं।

इस त्रुटि का कारण क्या है?

+3

आप एक गुजर रहे हैं ' int [] 'के रूप में एक स्ट्रिंग []' –

+0

के विपरीत शायद 'string.Format ("प्लेयर 1: {0} \ n प्लेयर 2: {1} \ n प्लेयर 3: {2} \ n प्लेयर 4: {3}" , जगह [0], जगह [1], जगह [2], जगह [3]); ' यह काम करता है जैसे आप स्ट्रिंग – Awais

+1

में प्रत्येक {} से संबंधित ऑब्जेक्ट पास करते हैं बस स्ट्रिंग.फॉर्मैट का उपयोग करने के बजाय, रिकॉर्ड के लिए, आप बना सकते हैं खिलाड़ियों की संख्या को हार्डकोड किए बिना स्ट्रिंग को अधिक गतिशील रूप से, उदाहरण के लिए: 'infoText.text = string.Join ("\ n", place.Select ((p, i) => $ "प्लेयर {i + 1}: {p} "));' –

उत्तर

3

आप int सरणी को स्ट्रिंग सरणी में पास करने के रूप में परिवर्तित करना होगा।

infoText.text = string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}", 
           place.Select(x=>x.ToString()).ToArray()); 
+0

तो तर्क एक 'स्ट्रिंग []' सरणी हो सकता है लेकिन एक 'int [] 'सरणी नहीं हो सकता है? – martin36

+0

@ martin36 न केवल 'स्ट्रिंग [] '- आपकी सरणी ऑब्जेक्ट या स्ट्रिंग प्रकार होनी चाहिए। –

7

त्वरित सुधार (infoText.text सिर्फ एक नियमित रूप से स्ट्रिंग वस्तु है)।

var place = new object[] { 1, 2, 3, 4 }; 

सी # int[] से object[] को सह संस्करण सरणी रूपांतरण का समर्थन नहीं करता तो इसके पूरे सरणी एक एकल पैरामीटर कहा जाता है के साथ, object के रूप में माना जाता है इसलिए this overload

+1

सी # _does_ समर्थन सह-संस्करण सरणी रूपांतरण (उदा। 'स्ट्रिंग [] 'से' ऑब्जेक्ट []') तक, लेकिन इस मामले में रूपांतरण में मूल्य प्रकार_ _boxing भी शामिल होगा, यही कारण है कि यह काम नहीं करेगा। – Joey

+2

@ जॉय: उन्होंने लिखा "_ से int-variant array रूपांतरण का समर्थन नहीं करता []" _ ;-) –

3

params तर्क के लिए एक स्पष्ट सरणी पारित करना संभव है, लेकिन इसमें मिलान प्रकार होना चाहिए। string.Format कुछ भार के हैं, जिनमें से निम्नलिखित दो हमारे लिए दिलचस्प हो सकते हैं:

string.Format(string, params object[]) 
string.Format(string, object) 

अपने मामले के इलाज int[]object के रूप में, केवल रूपांतरण है कि काम करता है के बाद से एक int[] परोक्ष (या स्पष्ट रूप से) नहीं किया जा सकता में करने के लिए परिवर्तित object[], इसलिए string.Format चार प्लेसहोल्डर देखता है, लेकिन केवल एक ही तर्क है। आपको सही प्रकार की

var place = new object[] {1,2,3,4}; 
+0

'पैराम्स ऑब्जेक्ट []' और केवल एक नियमित 'ऑब्जेक्ट [] 'के बीच क्या अंतर है सरणी? – martin36

+0

@ मार्टिन 36: आप किसी भी तर्क के रूप में 'पैराम पैरामीटर' का इलाज कर सकते हैं। संकलक स्वचालित रूप से विधि को कॉल करने के लिए उन्हें सरणी में लपेट लेगा। – Joey

+0

ठीक है, जानकारी के लिए धन्यवाद! – martin36

2

के रूप में दूसरों को पहले से ही कहा है, आप object[] को int[] परिवर्तित नहीं कर सकते। BTW

infoText.text = string.Format 
(
     "Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}",       
     place.Cast<object>().ToArray() 
); 

, यदि आप सी # 6 या इसके बाद के संस्करण पर हैं, आप के बजाय अंतर्वेशित तार string.Format उपयोग करने पर विचार हो सकता है:: लेकिन आप Enumerable.Cast<T>() का उपयोग कर इस समस्या को हल कर सकते हैं

infoText.text = $"Player1: {place[0]}\n Player 2: {place[1]} \n Player 3: {place[2]} \n Player 4: {place[3]}"; 
+0

मैं एकता का उपयोग कर रहा हूं और इसमें केवल संस्करण सी # 2. – martin36

+0

@ martin36 आपने सी # 2 के साथ अपना प्रश्न टैग नहीं किया है ... –

+0

ओह क्षमा करें, लेकिन किसी भी तरह के उत्तर के लिए धन्यवाद। मैं इसे बाद में उपयोग के लिए याद रखूंगा। – martin36

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