2010-07-15 15 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}

相关问题