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

时间:2010-03-02 17:13:33

标签: 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
}

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

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

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:7)

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

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

  

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

答案 2 :(得分:6)

我认为回答问题“为什么?”是没用的。但我有好消息,C#4.0有它们。

答案 3 :(得分:1)

可选参数并不像它们看起来那么简单。如果您有重载的方法都有可选参数,则可能会遇到复杂问题。解决规则可能会很快变得非常复杂。我想对于C#的第一个版本没有好的解决方案,所以他们跳过了可选参数。

但是你可能知道C#4.0会有可选的和命名的参数,所以一般来说这似乎不是一个坏主意! ; - )