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

sha*_*oth 59 .net c# reference argumentnullexception

如果我运行此代码:

Console.WriteLine( String.Format( "{0}", null ) );
Run Code Online (Sandbox Code Playgroud)

我得到一个,ArgumentNullException但如果我运行此代码:

String str = null;
Console.WriteLine( String.Format( "{0}", str ) );
Run Code Online (Sandbox Code Playgroud)

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

现在两件看起来相当于我 - 他们都传递了一个空引用String.Format()但行为是不同的.

如何识别不同的行为?

Jon*_*eet 76

只需反编译代码即可计算出正在发生的事情.

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

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

重载string.Format是:

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

希望最后三个选项无效的原因很明显.

制定出使用其中前两个的,编译器转换从比较null,以Object从转换nullObject[].转换为Object[]"更好",因为转换Object[]Object,但反之亦然.这与我们拥有的逻辑相同:

Foo(String)
Foo(Object)
Run Code Online (Sandbox Code Playgroud)

并要求Foo(null),它会选择Foo(String).

所以你的原始代码相当于:

object[] values = null;
string.Format("{0}", values);
Run Code Online (Sandbox Code Playgroud)

在这一点上,希望你会想到一个ArgumentNullException-按照文件.

  • "拿我的钱"按钮在哪里? (3认同)