我有两个重载方法,一个带有可选参数。
void foo(string a) { }
void foo(string a, int b = 0) { }
现在我打电话:
foo("abc");
有趣的是所述第一过载被调用。 为什么不把第二个重载设置为零可选值?
说实话,我本来期望编译器带来的错误,至少一个警告,以避免错误的方法的无意执行。
什么是对这种行为的原因是什么? 没有C#团队为什么把它定义呀?
我有两个重载方法,一个带有可选参数。
void foo(string a) { }
void foo(string a, int b = 0) { }
现在我打电话:
foo("abc");
有趣的是所述第一过载被调用。 为什么不把第二个重载设置为零可选值?
说实话,我本来期望编译器带来的错误,至少一个警告,以避免错误的方法的无意执行。
什么是对这种行为的原因是什么? 没有C#团队为什么把它定义呀?
从MSDN :
如果两个候选人被判断为一样好,偏好去不有哪些参数是在调用省略可选参数的候选人。 这是重载的一般偏好具有较少参数候选人的结果。
其不需要任何可选参数被自动填充的过载,优选其中一个一样。 然而,有一个参数自动灌装,灌装在一个以上的之间,没有这种偏爱 - 因此,例如,这会导致编译时错误:
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更好。
我认为,在大多数情况下,这是行为大多数人所期望的,是诚实的。 当你介绍基类方法混进去会很奇怪,但是这一直是这样。
试想一下,如果它是相反的。 你有一个应用程序。 它有一个方法:
void foo(string a) { }
Everyting工作的罚款。 现在,你要添加更多的重载带有可选参数:
void foo(string a, int b = 0) { }
繁荣! 所有的方法都去新方法。 每当你想不想要。 添加方法重载可能导致错误的方法调用遍布应用。
从我的角度来看,在这种情况下,你有更多的opporunities打破你的(或别人的)的代码。
此外, OptionalAttribute在C#中被忽视,直到4.0版本,但你可以使用它。 而有些人却用它在C#代码来支持某些互操作场景与其他语言,如Visual Basic,或COM互操作。 现在,C#使用它的可选参数。 添加警告/错误可能会引入这些应用的重大更改。
可能有一些其他的原因,但是这正是我想到的第一。