委托的默认参数值

Fel*_*ira 1 c# delegates

我需要调用作为参数传递的委托方法,但由于此参数是可选的,我想将默认值设置为在"destination"类中实现的方法.

这是一个几乎按预期工作的例子:

public class AgeCalculator
{
    public void SetAge(Client client, Func<int, int> getAge = default(Func<int, int>))
    {
        client.Age = getAge != default(Func<int, int>) ? getAge(client.Id) : this.getAge(client.Id);
    }

    private int getAge(int clientId) {
        return 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后..

class Program
{
    static void Main(string[] args)
    {
        AgeCalculator calculator = new AgeCalculator();

        Client cli1 = new Client(1, "theOne");

        calculator.SetAge(cli1);//Sets 10
        calculator.SetAge(cli1, getAge);//Sets 5
    }

    private static int getAge(int clientId) {
        return 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题 ; 必须设置的默认值是什么,以避免询问委托值?

尝试"public void SetAge(客户端客户端,Func getAge = this.getAge)"没有运气.

AgeCalculator.getAge需要标记或不同的定义吗?我应该使用动态方法吗?

提前致谢.

注意:真实场景涉及面向TDD的项目中更复杂的逻辑,这是一个总结情况的示例.

Jon*_*Jon 7

方法参数的默认值必须是编译时常量.写入default(Func<...>)只是详细的语法null,它是引用类型的默认值(作为委托,Func是引用类型),也是您可以在此上下文中使用的唯一默认值.

但是,使用为方法提供两个重载的传统方法,您可以做得更好:

public void SetAge(Client client)
{
    // Select any default value you want by calling the other overload with it
    SetAge(client, this.getAge);
}

public void SetAge(Client client, Func<int, int> getAge)
{
    client.Age = getAge(client.Id);
}
Run Code Online (Sandbox Code Playgroud)