在您的第一个示例中,您使用了Format(String, Object)
方法,反汇编后代码如下:
public static string Format(string format, object arg0)
{
return Format(null, format, new object[] { arg0 });
}
注意周围的new object[]
。
第二个例子,显然你正在使用Format(string, object[])
,至少当我执行相同的测试时是这样的。反汇编后,它看起来像这样:
public static string Format(string format, params object[] args)
{
return Format(null, format, args);
}
所以所有这些实际上都被汇集到Format(IFormatProvider, string, object[])
。 酷,让我们看一下那里的前几行:
public static string Format(IFormatProvider provider, string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
...
}
哎呀,问题就在这里!第一个调用将其包装在一个新的数组中,因此它不是null。明确传入null并不会使其这样做,这是由调用Format()
的特定实例决定的。
params
覆盖,而且String.Format
在继续迭代集合并插入值之前会测试数组是否被填充。 - Brad Christie