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

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

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. 

关于选择更好的过载,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); 

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

如果可能,调用可以在没有默认参数的情况下应用的那个。

在第一种情况下

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

第一种方法被称为。

在第二种情况:

 Person(1, 46.5); 

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

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

有关深入讨论,请参阅本文 。