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的。 显式地将其转换为string
或object
(或者使用C#的default()
特性)可以避免这个问题。