2014-06-25 61 views
2

我有如下定义在我的项目两种方法:用可选参数解决歧义和命名参数

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. 
+2

那么为什么你不测试它会被称为? –

+2

有两个有什么意义?你为什么不删除第一个,总是使用第二个? – khellang

回答

2

的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

如果可能的话,这可以在没有缺省参数被应用的一个被调用。

在第一种情况

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

首先方法被调用。

在第二种情况:

Person(1, 46.5); 

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

0

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

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