String.Format参数为空例外

下面的代码将抛出参数空exception

var test = string.Format("{0}", null); 

但是,这将返回一个空string

 string something = null; var test = string.Format("{0}", something); 

只是好奇,知道为什么第二块代码不抛出exception。 这是一个错误?

不同的是,第一段代码是调用string.Format(string, object[]) …而第二段代码是调用string.Format(string, object)

null是第二个方法的有效参数(它只是第一个占位符的值),而不是第一个(其中null通常是占位符数组 )。 特别是比较抛出NullArgumentException时的文档:

string.Format(string, object)
格式null

但:

string.Format(string, object[])
格式参数null

想想string.Format(string, object)被实现如下所示:

 public static string Format(string format, Object arg0) { return string.Format(format, new object[] { arg0 } ); } 

所以经过一些更换之后,你的代码更接近:

 // Broken code object[] args = null; // No array at all var test = string.Format("{0}", args); // Working code object[] args = new object[] { null }; // Array with 1 value var test = string.Format("{0}", args); 

第二个代码片段正在调用以下重载:

 Format(String, Object) 

这里的值可以是null,按照文档。

第一个代码片段使用以下重载:

 Format(String, Object[]) 

这里第二个值不能为null ,按照文档。

现有答案中没有提到的一个小问题,几乎使问题没有意义:

ArgumentNullException的完整消息是:

值不能为空。
参数名称:参数

这里问题的一部分是null是任何types的。 显式地将其转换为stringobject (或者使用C#的default()特性)可以避免这个问题。