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()特性)可以避免这个问题。