首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在传递"null“常量时会出现异常,而在传递"null”字符串引用时却没有?

为什么在传递"null“常量时会出现异常,而在传递"null”字符串引用时却没有?
EN

Stack Overflow用户
提问于 2012-12-14 19:10:28
回答 1查看 1.1K关注 0票数 59

如果我运行这段代码:

代码语言:javascript
复制
Console.WriteLine( String.Format( "{0}", null ) );

我得到一个ArgumentNullException,但是如果我运行下面的代码:

代码语言:javascript
复制
String str = null;
Console.WriteLine( String.Format( "{0}", str ) );

它运行得很好,输出是一个空字符串。

现在,这两段代码看起来和我一样--它们都向String.Format()传递了一个空引用,但行为却不同。

这里怎么可能有不同的行为呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-14 19:16:20

只要反编译代码就能搞清楚到底是怎么回事。

代码语言:javascript
复制
string.Format("{0}", null)

调用最具体的适用重载,即string.Format(string, object[])

string.Format的重载是:

代码语言:javascript
复制
Format(String, Object)
Format(String, Object[])
Format(IFormatProvider, String, Object[])
Format(String, Object, Object)
Format(String, Object, Object, Object)

希望最后三个选项无效的原因是显而易见的。

为了确定使用前两种转换中的哪一种,编译器会将从nullObject的转换与从nullObject[]的转换进行比较。到Object[]的转换被认为是“更好的”,因为存在从Object[]Object的转换,但反之亦然。这是相同的逻辑,如果我们有:

代码语言:javascript
复制
Foo(String)
Foo(Object)

名为Foo(null),它会选择Foo(String)

因此,您的原始代码相当于:

代码语言:javascript
复制
object[] values = null;
string.Format("{0}", values);

在这一点上,希望你能期待一个ArgumentNullException -根据文档。

票数 76
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13877501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档