String.Format参数Null Exception

Raj*_*j C 60 c#

下面的代码将抛出Argument Null Exception

var test = string.Format("{0}", null); 
Run Code Online (Sandbox Code Playgroud)

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

string something  = null; 
var test = string.Format("{0}", something); 
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 76

区别在于第一段代码正在调用string.Format(string, object[])...而第二段代码正在调用string.Format(string, object).

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

string.Format(string, object):
格式null

但:

string.Format(string, object[]):
formatargsnull

想想string.Format(string, object)作为正在实施的东西,如:

public static string Format(string format, Object arg0)
{
    return string.Format(format, new object[] { arg0 } );
}
Run Code Online (Sandbox Code Playgroud)

因此,经过一些替换后,您的代码更接近:

// 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); 
Run Code Online (Sandbox Code Playgroud)

  • 如果有人仍然怀疑有关,在这种情况下,使编译器选择'的String.Format规则(字符串,params对象[])``以上的String.format(字符串对象)`可能需要阅读的C#规格章"*更好函数成员*"(在ECMA标准中它是章节*14.4.2.2*,在当前的MS标准中它是章节*7.5.3.2*) - 归结为`null`参数不需要`params object [] `要扩展,并且`object []`是比`object`更具体的参数类型. (15认同)

Ser*_*rvy 16

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

Format(String, Object)
Run Code Online (Sandbox Code Playgroud)

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

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

Format(String, Object[])  
Run Code Online (Sandbox Code Playgroud)

在这里,第二个值不能为空,按文档.

  • @AmitJoki,你错过了"条件:**格式**为空"部分.在那里的文件...... (2认同)