2014-10-07 42 views
6

编辑1:我知道有替代方法,如伸缩,这是一个纯粹的教育问题。为什么默认的方法参数必须是C#编译时常量

我知道这是真的,但为什么它一定是?这似乎是像这样的东西:

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

因为在运行时值和编译时值之间可能存在差异。如果编码器需要编译时间值“硬编码”,那么GetBaz()会在运行时返回完全不同的内容并引发程序出错? – 2014-10-07 18:42:44

+5

如果您想知道为什么C#语言团队没有实现某个功能,请向他们询问,而不是与语言创建无关的随机开发人员。我们无法知道他们为什么选择不实施此功能。 – Servy 2014-10-07 18:42:55

+1

你总是有方法重载的选项 – 2014-10-07 18:43:52

回答

7

由于规范说这样:

固定参数具有默认参数的被称为可选 参数,而固定的参数不具有默认参数的是 所需的参数。在形式参数列表中的 可选参数后面可能不会出现所需的参数。参考或输出参数 不能有默认参数。在默认参数的 表达式必须是下列之一:

•常数表达式

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

•一个表达式默认(S)其中S是一个值类型

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

当参数被从一个功能构件省略与对应 可选参数,该功能部件 声明的默认参数隐式传递。因为这些总是不变的,所以他们的评估不会影响其余 论点的评估顺序。

+0

是的,这是一个很好的观点,如果您使用方法作为默认值,那么如果您有多个默认值并且在哪个时间点 – 2014-10-07 18:49:03

相关问题