我的项目有两种方法,如下所示:
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.
答案 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。