编辑1:我知道有一些替代方案,例如伸缩式,这是一个纯粹的教育问题。
我知道这是真的,但为什么一定是这样呢?看起来像这样:
public class Foo{
private int bar;
public void SetBar(int baz = ThatOtherClass.GetBaz(3)){
this.bar = baz;
}
}
编译器可以将方法更改为:
public void SetBar(int baz){
//if baz wasn't passed:
baz = ThatOtherClass.GetBaz(3);
this.bar = baz;
}
为什么不能这样做,或者它会不会,而且它只是一个设计决定?
答案 0 :(得分:7)
因为规范是这样说的:
带有default-argument的fixed-parameter称为可选参数 参数,而没有默认参数的固定参数是a 必需参数。在a之后可能不会出现所需的参数 形式参数列表中的可选参数。 ref或out参数 不能有一个默认参数。 default-argument中的表达式 必须是以下之一:
•常量表达式
•new S()形式的表达式,其中S是值类型
•形式为default(S)的表达式,其中S是值类型
至于为什么语言设计师选择这样做,我们只能猜测。然而,该规范的另一部分提示答案:
当从具有相应的函数成员中省略参数时 可选参数,函数成员的默认参数 声明被隐含地传递。因为这些总是不变的, 他们的评估不会影响其余的评估顺序 参数。