【问题标题】:Why must default method parameters be compile-time constants in C# [closed]为什么默认方法参数必须是 C# 中的编译时常量 [关闭]
【发布时间】:2014-12-02 06:57:12
【问题描述】:

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

}

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

【问题讨论】:

  • 因为运行时值和编译时值之间可能存在差异。如果编码人员想要在其中“硬编码”一个编译时值,但 GetBaz() 然后在运行时返回完全不同的东西并使程序失控怎么办?
  • 如果您想知道为什么 C# 语言团队没有实现某个功能,请询问他们,而不是与语言创建无关的随机开发人员。我们不知道他们为什么选择不实施此功能。
  • 你总是可以选择方法重载
  • 我不知道为什么,但是如果你想解决这个问题,只需在没有参数的情况下进行重载,而不是使用默认参数void SetBar() { SetBar(ThatOtherClass.GetBaz(3)) }; void SetBar(int baz) { this.bar = baz; }
  • @user1825860 您确切地知道如何完成此任务的事实表明,它绝对可能的。这是语言团队选择不花费时间和金钱来构建的功能。如果你想知道为什么会这样,你可以试着问他们(尽管我不会屏住呼吸)。我们所能做的就是猜测他们为什么不优先考虑这样做。

标签: c# default compile-time-constant


【解决方案1】:

因为规范是这样说的:

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

• 一个常量表达式

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

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

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

当函数成员省略参数时 可选参数,函数成员的默认参数 声明被隐式传递。因为这些总是不变的, 他们的评估不会影响其余的评估顺序 论据。

【讨论】:

  • 是的,这很好,如果你使用方法作为你的默认值,如果你有多个默认值并且在什么时候执行这些方法应该按什么顺序执行
猜你喜欢
  • 1970-01-01
  • 2012-10-05
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多