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

Alp*_*der 8 c# default compile-time-constant

编辑1:我知道有一些替代品,如伸缩式,这是一个纯粹的教育问题.

我知道这是真的,但为什么一定是这样呢?看起来像是这样的:

public class Foo{

    private int bar;

    public void SetBar(int baz = ThatOtherClass.GetBaz(3)){
        this.bar = baz;
    }

}
Run Code Online (Sandbox Code Playgroud)

编译器可以将方法更改为:

public void SetBar(int baz){

//if baz wasn't passed:
baz = ThatOtherClass.GetBaz(3);

this.bar = baz;

}
Run Code Online (Sandbox Code Playgroud)

为什么那不起作用,或者不行,这只是一个设计决定?

Bra*_*NET 7

因为规范如此说:

具有default-argument的fixed-parameter被称为可选参数,而没有default-argument的fixed-parameter是必需参数.在formal-parameter-list中的可选参数之后,可能不会显示必需参数.ref或out参数不能具有default-argument.default-argument中的表达式必须是以下之一:

•常量表达式

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

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

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

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