冲突重载方法使用可选参数冲突重载方法使用可选参数(Conflicting overloaded me

2019-05-10 10:03发布

我有两个重载方法,一个带有可选参数。

void foo(string a)  { }  
void foo(string a, int b = 0) { }  

现在我打电话:

 foo("abc");

有趣的是所述第一过载被调用。 为什么不把第二个重载设置为零可选值?

说实话,我本来期望编译器带来的错误,至少一个警告,以避免错误的方法的无意执行。

什么是对这种行为的原因是什么? 没有C#团队为什么把它定义呀?

Answer 1:

从MSDN :

如果两个候选人被判断为一样好,偏好去不有哪些参数是在调用省略可选参数的候选人。 这是重载的一般偏好具有较少参数候选人的结果。



Answer 2:

其不需要任何可选参数被自动填充的过载,优选其中一个一样。 然而,有一个参数自动灌装,灌装在一个以上的之间,没有这种偏爱 - 因此,例如,这会导致编译时错误:

void Foo(int x, int y = 0, int z = 0) {}
void Foo(int x, int y = 0) {}
...
Foo(5);

需要注意的是美孚(5,5)将被解析为第二种方法,因为这样不需要任何可选参数中自动填充。

从C#4规范的部分7.5.3.2:

否则,如果MP的所有参数具有相应的参数,而默认参数需要在MQ用于替换至少一个可选的参数则MP比MQ更好。

我认为,在大多数情况下,这是行为大多数人所期望的,是诚实的。 当你介绍基类方法混进去会很奇怪,但是这一直是这样。



Answer 3:

试想一下,如果它是相反的。 你有一个应用程序。 它有一个方法:

void foo(string a)  { }   

Everyting工作的罚款。 现在,你要添加更多的重载带有可选参数:

void foo(string a, int b = 0) { }  

繁荣! 所有的方法都去新方法。 每当你想不想要。 添加方法重载可能导致错误的方法调用遍布应用。

从我的角度来看,在这种情况下,你有更多的opporunities打破你的(或别人的)的代码。

此外, OptionalAttribute在C#中被忽视,直到4.0版本,但你可以使用它。 而有些人却用它在C#代码来支持某些互操作场景与其他语言,如Visual Basic,或COM互操作。 现在,C#使用它的可选参数。 添加警告/错误可能会引入这些应用的重大更改。

可能有一些其他的原因,但是这正是我想到的第一。



文章来源: Conflicting overloaded methods with optional parameters