Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 空文本参数类型重载解析_C#_.net - Fatal编程技术网

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[]
在这种情况下,参数的类型是
字符串。