C#不支持可选/默认参数的原因是什么? 我很喜欢那些在C++编程的日子里那些甜美的可选论点。我知道它们在C#中不存在,但我的问题是为什么

C#不支持可选/默认参数的原因是什么? 我很喜欢那些在C++编程的日子里那些甜美的可选论点。我知道它们在C#中不存在,但我的问题是为什么,c#,language-design,C#,Language Design,我认为方法重载是一个糟糕的替代品,它会很快把事情弄得一团糟 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#时,他们不想支持可

我认为方法重载是一个糟糕的替代品,它会很快把事情弄得一团糟

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#时,他们不想支持可选参数?

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

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


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

正如Andrey所说,C#4有可选参数和命名参数。然而,值得指出的是,一个让Anders不愿意首先包含它们的问题——即默认值(必须是常量)被烘焙到调用代码中——仍然存在。换言之,这与C#1中可公开访问的
const
值的问题相同。

它还不存在,但它在C#4中。这在很大程度上取决于成本,以及该特性与语言的主要新部分(如.NET2中的泛型,或3中的linq)的匹配程度。可选参数将与第4版中的新动态内容相匹配,因此已包括在内

引用(他自己的话)关于为什么许多看起来不错的功能没有包括在内:

(1) 这不是一个减法过程;我们不从C++或java或Haskell开始,然后决定是否将它们的一些特征留出来。(2)仅仅是一个好的特性是不够的。功能必须是如此引人注目,以至于它们值得为设计、实现、测试、记录和发布功能付出巨大的成本。它们必须值得付出使语言复杂化的代价,并使将来设计其他功能更加困难


哦,我不知道。我很期待!:)另一方面,C#4.0使用它们是为了更容易的互操作性,而不是为了一般目的——大多数人不会理解这一点,只会将它们用于所有用途。我不认为这是好消息。同意这一点。问题是,大多数使用默认值的开发人员都不理解默认值的问题,当使用不同的默认值更新带有可选参数的程序集时,问题变得复杂起来。另一方面,命名参数是具有可选参数的一个好参数……我不相信针对可选参数的参数。更改公共API时,用户必须更改其代码以对不同的行为作出反应,无论您使用的是方法重载还是可选参数。@chaosption:无论您是否购买,这就是Anders之前给出的原因。我不太理解您的反应。@chaosption:您说您没有“购买”这个论点——我是说这是语言设计师给出的论点,所以这就是C#以前没有可选参数的原因,不管你(或我)是否同意这个理由。+1因为未来适应其他功能的复杂性会增加,尽管我喜欢默认论点。Sam Ng在博客中谈到了这一点,哲学!第节: