空文字参数类型重载决议

Pet*_*lly 9 .net c#

可能重复:
当传递空值时,方法重载决策系统如何决定调用哪个方法?

这是一个关于为什么编译器在传递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文字与第二个方法签名匹配而不是第一个?

InB*_*een 3

我只是猜测这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)