C# 空文本参数类型重载解析
可能重复:C# 空文本参数类型重载解析,c#,.net,C#,.net,可能重复: 这是一个关于为什么编译器在将null文本作为参数传递时选择某个重载的问题,由string.Format重载演示 string.Format(string, object); string.Format(string, object[]); string.Format(IFormatProvider, string, object[]); 当对args参数使用null文本时,Format抛出一个ArgumentNullException string.Format("foo {0}
这是一个关于为什么编译器在将null文本作为参数传递时选择某个重载的问题,由string.Format重载演示
string.Format(string, object);
string.Format(string, object[]);
string.Format(IFormatProvider, string, object[]);
当对args参数使用null文本时,Format抛出一个ArgumentNullException
string.Format("foo {0}", null);
Format方法有一些重载
string.Format(string, object);
string.Format(string, object[]);
string.Format(IFormatProvider, string, object[]);
在反编译代码中运行时,第二个方法会引发null literal args的异常。但是,下面的示例调用上面的第一个方法(如预期的那样),然后调用第二个方法,第二个方法调用第三个方法,最后只返回“foo”
但是
string.Format(“foo{0}”,null)
调用上面的第二个方法并导致null异常。在这种情况下,为什么编译器决定null文本与第二个方法签名匹配,而不是与第一个方法签名匹配 我只想猜测object[]
比object
更具体,如果null
可分配给object[]
则选择前者。(7.5.3.2 C#规范中更好的功能构件)
如果您尝试以下操作,也会发生同样的情况:
void Foo(object o) {}
void Foo(object[] arr) {}
Foo(null); //Foo(object[]) gets called.
不能给你100%的确定性,但我最好的猜测如下 如果我亲自编写编译器,并且必须根据传递的参数选择要使用的重载函数,我自然会迭代列表并找到最佳匹配。我想在C#编译器中实现了一些类似的东西 因此,这会向我建议,要么“重载2”(在您的示例中)在列表中比“重载1”早,因此找到匹配项并中断迭代,要么编译器设置为使用后一个匹配重载 当然,在你的2个例子中,通过x和y。在将字符串与对象匹配时,很容易将其与“重载1”匹配,而字符串无法与对象[]匹配,因此“重载2”不是有效匹配 当您直接传递null时,它将与“重载1”和“重载2”匹配,因此返回到列表中第一个找到的位置或最后一个找到的位置
编辑:结果是编译器essential根据哪些参数更具体来决定。和object[]如果该对象更具体。如果它包含更一般意义上的varargs(如果它不是string.Format-specific)的话,可能会扩大标题/范围。Pete,你可能知道这一点(这不是对你问题的回答),但我要提到它;为了避免此异常,可以使用
String.Format(“Testing{0}”,String.Empty)代码>。祝您一切顺利。重复问题:。简而言之:重载解析更喜欢更具体的类型。因此它选择数组是因为object
是.NET中最不具体的类型。@Jan:这也解释了为什么其他两个示例选择object而不是object[]吗?在其他两个示例中,不能使用object[]
参数重载,因为string
不是object[]
在这种情况下,参数的类型是字符串。