String.Format参数Null Exception

时间:2014-07-01 17:37:38

标签: c#

以下代码将抛出Argument Null Exception

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

但是,这将返回一个空字符串

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

只是想知道为什么第二段代码不会引发异常。这是一个错误吗?

3 个答案:

答案 0 :(得分:76)

不同之处在于第一段代码正在调用string.Format(string, object[]) ...而第二段代码正在调用string.Format(string, object)

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

  

string.Format(string, object)
  格式null

可是:

  

string.Format(string, object[])
  格式 args 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); 

答案 1 :(得分:16)

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

Format(String, Object)

根据文档,这里的值可以为null。

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

Format(String, Object[])  

根据文档,第二个值不能为空

答案 2 :(得分:0)

现有答案未提及的一个小问题,几乎使问题没有实际意义:

ArgumentNullException的完整消息是:

  

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

此处的部分问题是null是任何类型的。明确地将其强制转换为stringobject(或使用C#default()功能)可以避免此问题。