以下代码将抛出Argument Null Exception
var test = string.Format("{0}", null);
但是,这将返回一个空字符串
string something = null;
var test = string.Format("{0}", something);
只是想知道为什么第二段代码不会引发异常。这是一个错误吗?
答案 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
是任何类型的。明确地将其强制转换为string
或object
(或使用C#default()
功能)可以避免此问题。