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

C# 为什么C中的默认方法参数必须是编译时常量#,c#,default,compile-time-constant,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: ba

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

}
编译器可以将该方法更改为以下内容:

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;

}

为什么这不起作用,或者它会起作用,而这只是一个设计决策?

因为规范中这么说:

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

•恒定表达式

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

•默认形式的表达式,其中S为值类型

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

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


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