8

编辑 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;

}

为什么那行不通,或者行不通,而这只是一个设计决定?

4

1 回答 1

7

因为规范是这样说的:

带有默认参数的固定参数称为可选参数,而没有默认参数的固定参数是必需参数。在形式参数列表中,必需参数可能不会出现在可选参数之后。ref 或 out 参数不能有默认参数。默认参数中的表达式必须是以下之一:

• 常量表达式

• new S() 形式的表达式,其中 S 是值类型

• default(S) 形式的表达式,其中 S 是值类型

至于语言设计者为什么选择这样做,我们只能猜测。然而,另一条规范暗示了一个答案:

当具有相应可选参数的函数成员省略参数时,函数成员声明的默认参数将被隐式传递。因为这些总是不变的,所以它们的评估不会影响其余参数的评估顺序。

于 2014-10-07T18:47:27.313 回答