使用可选参数和命名参数解决歧义

时间:2014-06-25 12:54:45

标签: c# .net methods

我的项目有两种方法,如下所示:

void Person(int ID, double height = 0.0, string team = "Knights")
{
   //my codes
}
void Person(int ID, double height = 0.0, string team = "Knights", int age = 30)
{
   //my codes
}

这是我调用方法的地方:

Person(1, 2.5, "Dark Ghost"); //calls first method

我在构建项目时没有遇到任何错误,但是我很困惑为什么上面调用第一种方法?

和:

Person(1, 46.5);   //compiler error. 

3 个答案:

答案 0 :(得分:3)

C#规范在§7.5.3.2中说明了选择更好的过载:

  

如果[方法A]的所有参数都有相应的参数,而默认参数需要替换[方法B]中的至少一个可选参数,则[方法A]优于[方法B]。

为所有参数指定值时:

Person(1, 2.5, "Dark Ghost");

上述规则使第一种方法成为更好的候选方法,并将其选为正确的重载方法。

当你不这样做时:

Person(1, 46.5);

规则不适用,重载决策不明确。


您可能会说,为什么不选择参数最少的那个?一开始看起来很好,但是当你有这样的事情时会引起问题:

void Foobar(int a, string b = "foobar")
{
}

void Foobar(int a, int b = 0, int c = 42)
{
}

...

Foobar(1);

在这种情况下,没有正当理由在第二个选择第一个。因此,您只能通过为所有参数提供值来正确解决此问题。

答案 1 :(得分:1)

如果可能的话,可以调用无默认参数的那个。

在第一种情况下

Person(1, 2.5, "Dark Ghost");

调用第一种方法。

在第二种情况下:

Person(1, 46.5);

这只会导致构建错误。 "以下方法或属性之间的调用不明确: Test.Person(int,double,string)和Person(int,double,string,int)"。

答案 2 :(得分:0)

TL:DR 将调用第一个方法(最具体),因为在这种情况下,不需要使用默认值绑定参数。

有关深入讨论,请参阅this article