为什么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#语言规范的哪一部分?

获取c# 4规范的副本;您可以下载或购买带注释的纸质版本。你想读的章节是7.5.1"参数列表"和7.5.3"重载解析"。具体请参见第7.5.3.2节"更好的函数成员"。

描述你所看到的行为的确切行是:

如果Mp的所有参数都有相应的实参,而默认实参需要替换Mq中的至少一个可选参数,则Mp优于Mq。

编译器有规则来选择正确的重载