2016-11-30 32 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()中的參數也相同。

是什麼導致了這個錯誤?

(該infoText.text只是一個普通的字符串對象)

+3

你傳遞一個' int []'而不是'string []' –

+0

也許像'string.Format(「Player1:{0} \ n Player2:{1} \ n Player3:{2} \ n Player4:{3}」 ,[0],位置[1],位置[2],位置[3]);' 當你傳遞一個與字符串中每個{}有關的對象時,它就起作用 – Awais

+1

只是爲了記錄而不是使用string.format,你可以創建該字符串更動態,不需要硬編碼玩家數量,例如:'infoText.text = string.Join(「\ n」,place.Select((p,i)=> $「Player {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

所以參數可以是一個'string []'數組而不是'int []'數組? – martin36

+0

@ martin36不僅'string []' - 你的數組應該是一個對象或字符串類型。 –

7

快速修復。

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

C#不支持共變體陣列轉換從int[]object[]爲此整個陣列與單個參數被稱爲視爲object,因此this overload

+1

C#_does_支持協變數組轉換(例如從'string []'到'object []'),但在這種情況下,轉換也會涉及值類型的_boxing,這就是爲什麼它不起作用。 – Joey

+2

@Joey:他寫道_「不支持從int []到object []」_ ;-)的協變數組轉換 –

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

'params object []'和只是一個常規'object []'陣列? – martin36

+0

@ martin36:您可以將'params'參數視爲任意數量的參數。編譯器會自動將它們包裝在一個數組中以調用該方法。 – Joey

+0

好的,謝謝你的信息! – martin36

2

正如其他人已經說過,你不能轉換到int[]object[]。 BTW

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

,如果你在C#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

我正在使用Unity,它只有C#2版本。 – martin36

+0

@ martin36您沒有用C#2標記您的問題... –

+0

哦,對不起,但謝謝你的答案。我會記住它以備後用。 – martin36