这是一个关于为什么编译器在传递null文字作为参数时选择某个重载的问题,由string.Format重载证明.
ArgumentNullException当为args参数使用null literal时,string.Format会抛出一个.
string.Format("foo {0}", null);
Run Code Online (Sandbox Code Playgroud)
Format方法有一些重载.
string.Format(string, object);
string.Format(string, object[]);
string.Format(IFormatProvider, string, object[]);
Run Code Online (Sandbox Code Playgroud)
运行反编译代码,从第二个方法抛出null文字args的异常.但是,下面的示例调用上面的第一个方法(如预期的那样)然后调用第二个调用第三个方法最终返回"foo".
string x = null;
string.Format("foo {0}", x);
string y;
string.Format("foo {0}", y = null);
Run Code Online (Sandbox Code Playgroud)
但是string.Format("foo {0}", null)调用上面的第二个方法并导致null异常.为什么编译器在这种情况下决定null文字与第二个方法签名匹配而不是第一个?
我只是猜测这object[]比选择的更具体object并且可null分配给object[]前者。(C# 规范中的 7.5.3.2 更好的函数成员)。
如果您尝试以下操作,也会发生同样的情况:
void Foo(object o) {}
void Foo(object[] arr) {}
Foo(null); //Foo(object[]) gets called.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |