C#不支持可选/默认参数的原因是什么?

Ear*_*rlz 8 c# language-design

在我用C++编程的日子里,我渴望那些甜蜜的可选参数.我知道它们不存在于C#中,但我的问题是为什么.

我认为方法重载是一个糟糕的替代品,使得事情很快就会变得混乱.

void foo(int x,int y,int z=0){
  //do stuff...
}

//is so much more clean than

void foo(int x,int y){
  foo(x,y,0);
}
void foo(int x,int y,int z){
 //do stuff
}
Run Code Online (Sandbox Code Playgroud)

我只是不明白是什么原因.C#编译器显然没有问题支持这个只是微软选择不支持它.

为什么在设计C#时,他们不想支持可选参数?

Jon*_*eet 12

正如Andrey所说,C#4有可选参数命名参数.然而,值得指出的是,让Anders不愿意将它们包括起来的一个问题 - 即默认值(必须是常量)被包含在调用代码中 - 仍然存在.换句话说,它const与C#1中可公开访问的值相同.

  • 同意这个.问题是大多数使用它的开发人员都不理解默认值的问题,当使用*不同的默认值*更新带有可选参数的程序集时会变得复杂.另一方面,命名参数是一个很好的参数,有可选参数... (4认同)

Jac*_*yan 7

它还没有,但它在C#4中.这主要与成本有关,以及该功能与语言的主要新部分(例如.Net 2中的Generics,或3中的linq)的匹配程度.可选参数适用于版本4中的新动态内容,因此已包含在内.

引用Eric Lippert(他自己引用Eric Gunnerson)的原因为什么不包括许多看似不错的功能:

(1)这不是减法过程; 我们不是从C++或Java或Haskell开始,然后决定是否要保留它们的一些功能.而且(2)仅仅是一个好的功能是不够的.功能必须如此引人注目,以至于它们值得花费巨大的设计,实施,测试,记录和运输功能的美元成本.它们必须值得使语言复杂化并使将来设计其他功能变得更加困难.


And*_*rey 6

我认为回答"为什么?"这个问题毫无用处.但我有好消息,C#4.0有它们.