标签:
public fun1(A a ,B b) { //代码主体 }
public fun1(A a ,B b,C c = 1) { //代码主体 }
public fun1(A a ,B b) { fun1(A a ,B b,1); } public fun1(A a ,B b,C c) { //代码主体 }
public fun1(A a ,B b) { fun1(A a ,B b,1); } public fun1(A a ,B b,C c) { //代码主体 }
七、网友解答:感谢CYJB和其他网友的热心解答,非常详尽
楼主为方法添加了一个默认参数,那么这个新的方法和之前的方法的签名是完全不同的——对应的参数个数是不同的,所以才会出现找不到方法的错误。.Net 里的可选参数就像 @冲杀 说的,就是一个语法糖,仅仅是编译器在方法调用的时候自动加上了默认参数值而已,编译器完全可能不支持这一功能。
实际上,根据 VS “代码分析”功能,可以发现公共方法使用默认参数,是具有一定风险的,因为:在公共语言规范 (CLS) 中允许方法使用默认参数;但是 CLS 允许编译器忽略为这些参数分配的值。 为忽略默认参数值的编译器编写的代码必须为每个默认参数显式提供变量。 为了跨编程语言维护所需的行为,必须使用提供默认参数的方法重载来替换使用默认参数的方法。完整的文档可以参考 MSDN CA1026:不应使用默认参数。
最后,公共方法的确是应该只扩展不修改的,以保持良好的兼容性,楼主应该是没有想到 C# 的默认参数只是一个语法糖,而不慎中招了。而微软为何没有将默认方法实现为多个重载,不是不愿,而是不能。例如下面的方法:
public void TestMethod(int a = 100, int b = 200, int c = 300) { // ... }
如果自动实现为多个重载,显然是不可能的,因为参数的类型都是 int,无法根据参数类型来区分出参数 a、b 和 c,因此微软会完全放弃这个方案。而代码膨胀之类的,可能也在微软的考虑范围内。
标签:
原文地址:http://www.cnblogs.com/yuqlblog/p/4744440.html