为什么默认方法参数必须是C#中的编译时常量

时间:2014-10-07 18:39:28

标签: c# default compile-time-constant

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

}

为什么不能这样做,或者它会不会,而且它只是一个设计决定?

1 个答案:

答案 0 :(得分:7)

因为规范是这样说的:

  

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

     

•常量表达式

     

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

     

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

至于为什么语言设计师选择这样做,我们只能猜测。然而,该规范的另一部分提示答案:

  

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