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从转换null到Object[].转换为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-按照文件.