2010-07-15 17 views
19

請考慮string.Format(),其參數是字符串,其中包括過載列表中的object[]或許多對象。string.Format在運行時失敗並出現整數陣列

該語句成功:

string foo = string.Format("{0} {1}", 5, 6); 

爲做到這一點:

object[] myObjs = new object[] {8,9}; 
string baz = string.Format("{0} and {1}", myObjs; 

一樣字符串數組:

string[] myStrings = new string[] {"abc", "xyz"}; 
string baz = string.Format("{0} {1}", myStrings); 

看來,整數,當單獨指定,可以裝箱或強制鍵入object,然後強制爲一個字符串。

此聲明在運行時失敗。

int[] myInts = new int[] {8,9}; 
string bar = string.Format("{0} and {1}", myInts); 

指數(基於零的)必須大於參數列表的大小大於或等於零且小於。

  • 爲什麼沒有或不能在int數組被強制或盒裝到object[]string[]
  • 出於一點好奇心,爲什麼編譯器不知道這個?

回答

24

調用失敗,同樣的原因,下面也將失敗:

string foo = string.Format("{0} {1}", 5); 

您在format指定兩個論點,但僅指定一個對象。

編譯器沒有捕獲它,因爲int[]作爲一個對象傳遞,它是函數的一個完全有效的參數。

還要注意的是陣列協方差不值類型工作,所以你不能這樣做:

object[] myInts = new int[] {8,9}; 

但是你可以逃脫:

object[] myInts = new string[] { "8", "9" }; 
string bar = string.Format("{0} {1}", myInts); 

這將工作,因爲你會被使用String.Format超載,接受object[]

+0

AO:感謝這個答案。我已經更新了這個問題,以包含'string []'string.Format()'的成功。這與'int []'有什麼不同? – 2010-07-15 17:36:02

+0

@ p.campbell,請參閱有關數組協方差在值類型中不受支持的更新。 – 2010-07-15 17:38:04

+0

所以你說'int []'是作爲一個對象而不是數組或對象數組傳遞的,但'object []'會作爲一個數組傳遞? – Jack 2013-03-29 10:25:55

0

您的string.Format需要2個參數({0}和{1})。你只提供1個參數(int [])。你需要更多的東西是這樣的:

string bar = string.Format("{0} and {1}", myInts[0], myInts[1]); 

因爲該格式字符串是在運行時評估的編譯器不會注意到這個問題。 IE編譯器不知道{0}和{1}表示應該有2個參數。

0

這工作:

string bar = string.Format("{0} and {1}", myInts[0], myInts[1]); 

編譯器不抓住它,因爲它不評估您的格式字符串。

您放棄頂部的示例與您在下面嘗試執行的示例不匹配......您提供了兩個{}和兩個參數,但在底部您只提供了一個參數。

3

您的通話被翻譯成這樣:

string foo = string.Format("{0} {1}", myInts.ToString()); 

導致此字符串:

string foo = "System.Int32[] {1}"; 

因此,作爲{1}沒有一個參數,它拋出一個異常

2

我認爲你有一個問題的概念是爲什麼int[]沒有投到object[]。下面是說明爲什麼這將是壞

int[] myInts = new int[]{8,9}; 
object[] myObjs = (object[])myInts; 
myObjs[0] = new object(); 

的問題是,我們剛纔添加的對象爲int數組的例子。

那麼,在你的代碼的情況是,myInts被轉換爲object,你沒有第二個參數,填補了{1}

相關問題