繁体   English   中英

String.Format参数Null Exception

[英]String.Format Argument Null Exception

下面的代码将抛出Argument Null Exception

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

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

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

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

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

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

string.Format(string, object)
formatnull

但:

string.Format(string, object[])
formatargsnull

想象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的完整消息是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM