【问题标题】:Use a function to define an optional parameter使用函数定义可选参数
【发布时间】:2019-12-11 12:19:43
【问题描述】:

是否可以使用函数的返回值而不是特定值作为函数中的可选参数? 例如,而不是:

public void ExampleMethod(int a, int b, int c=10)
{
}

我想要类似的东西

private int ChangeC(int a, int b)
{
    return a+b;
}

public void ExampleMethod(int a, int b, int c=ChangeC(a,b))
{
}

【问题讨论】:

  • 否,因为该方法的参数在该上下文中不存在。您可以在方法的第一行使用它: c = c ??变化C(a,b)
  • 请用伪代码举例。有点不清楚你想要实现什么。
  • 你可以有两个方法的重载 - 一个有三个参数,一个有两个,使用函数调用的结果作为第三个参数调用第一个

标签: c# optional-parameters


【解决方案1】:

不,这是不可能的。对于可选的参数,其值必须是编译时间常数。但是,您可以像这样重载该方法:

private int ChangeC(int a, int b)
{
    return a + b;
}

public void ExampleMethod(int a, int b, int c) {}

public void ExampleMethod(int a, int b)
{
    ExampleMethod(a, b, ChangeC(a, b));
}

这样您就不必处理可为空的值类型

【讨论】:

    【解决方案2】:

    其中一种方式:

    private int ChangeC(int a, int b)
    {
        return a+b; 
    } 
    
    public void ExampleMethod(int a, int b, int? c=null)
    {
        c = c ?? ChangeC(a,b);
    }
    

    【讨论】:

      【解决方案3】:

      是否可以使用函数的返回值而不是特定值作为函数中的可选参数?

      没有。这不可能。 Optional Arguments 上的 C# 编程指南说:

      默认值必须是以下表达式类型之一:

      • 一个常量表达式;

      • new ValType() 形式的表达式,其中ValType 是值类型,例如enumstruct

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

      查看替代解决方案的其他答案。

      【讨论】:

        猜你喜欢
        • 2018-07-21
        • 2021-11-22
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多