使用可选参数的方法重载

28

我有一个类,其中包含两个重载方法。

Class A
{
    public string x(string a, string b)
    {
        return "hello" + a + b;
    }

    public string x(string a, string b, string c = "bye")
    {
        return c + a + b;
    }
}
如果我从另一个类中使用两个参数调用方法x,那么哪个方法将执行以及为什么?即,
string result = new A().x("Fname", "Lname");

我在控制台应用程序中测试了这个方法,并且带有2个参数的方法执行了。有人能解释一下吗?

我已在控制台应用程序中测试此方法,其中带有两个参数的方法被执行。是否有人能够解释一下这个情况?


1
基本上:在这种情况下,拥有默认值完全没有用,因为你永远不会使用它... - Bakuriu
8
我很惊讶这段代码居然没有编译时错误。 - Cyril Gandon
3个回答

31

使用命名参数和可选参数会影响重载决策:

如果两个方法被判断为同样好,那么优先选择没有省略调用时可选参数的方法。这是因为在重载决策中,优先选择参数更少的方法。

参考文献:MSDN


以上规则意味着带有2个参数的方法string x(string a,string b)将被调用。

注意:如果两个重载方法都有可选参数,则编译器会给出编译时二义性错误。


5
编译器会在编译时出现模糊错误 :) - Tamir Vered
1
@JerryGoyal 有没有一种方法可以在不显式传递参数的情况下调用带有可选参数的方法? 例如,我想使用默认值在 string c 中调用第二个方法。我该怎么做? - rahul_sann
@rahul_sann 在我看来,这是不可能的。如果已经存在一个参数少的重载函数,则必须传递可选参数。上述示例中有两种可能的方法:new A().x("Fname", "Lname", c:"bye")new A().x("Fname", "Lname", c: default)。虽然我确定您不想要这样。 - MKR

4
如果您使用两个参数调用该方法,则会使用带有两个参数的方法。如果您使用三个参数进行调用,则会使用另一个方法。

1
它将始终执行与确切参数数量第一次匹配的方法,在您的情况下,它将执行:

可选参数方法的优先级低于具有确切参数数量的函数。

public string x(string a, string b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接