为什么c#编译器不会对具有默认参数的方法感到困惑?
本文关键字:方法 参数 默认 编译器 为什么 | 更新日期: 2023-09-27 18:13:57
为什么c#编译器不会对具有默认参数的方法感到困惑?
在下面的代码中,SayHello()
可以指:
- SayHello ()
- SayHello(string arg1 = null)
- SayHello(string arg1 = null, string arg2 = null)
- SayHello(字符串arg1 = null,字符串arg2 = null,字符串arg3 = null)
但是这段代码编译成功,没有任何歧义错误。
class Program
{
private static void SayHello()
{
Console.WriteLine("Hello 1");
return;
}
private static void SayHello(string arg1 = null)
{
Console.WriteLine("Hello 2");
return;
}
private static void SayHello(string arg1 = null, string arg2 = null)
{
Console.WriteLine("Hello 3");
return;
}
private static void SayHello(string arg1 = null, string arg2 = null, string arg3 = null)
{
Console.WriteLine("Hello 3");
return;
}
private static void Main(string[] args)
{
SayHello(); // SayHello() invoked, but SayHello(string arg1 = null) not invoked.
SayHello("arg1");
SayHello("arg1", "arg2", "arg3");
// Output is:
// Hello 1
// Hello 2
// Hello 3
return;
}
}
编译器将首先选择没有任何可选参数的方法。因此,就编译器而言,您的代码中没有歧义。
为什么c#编译器不会混淆有默认参数的方法?
这个问题无法回答。一个可以回答的问题是:
如果我想了解重载解析如何处理默认参数,我应该阅读c#语言规范的哪一部分?
获取c# 4规范的副本;您可以下载或购买带注释的纸质版本。你想读的章节是7.5.1"参数列表"和7.5.3"重载解析"。具体请参见第7.5.3.2节"更好的函数成员"。
描述你所看到的行为的确切行是:
如果Mp的所有参数都有相应的实参,而默认实参需要替换Mq中的至少一个可选参数,则Mp优于Mq。
编译器有规则来选择正确的重载