gpt4 book ai didi

c# - 委托(delegate)的默认参数值

转载 作者:太空宇宙 更新时间:2023-11-03 18:09:46 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Optional delegates in C# [duplicate]

(4 个回答)


8年前关闭。




我需要调用作为参数传递的委托(delegate)方法,但由于此参数是可选的,我想将默认值设置为在“目标”类中实现的方法。

这是一个几乎可以按预期工作的示例:

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;
}
}

接着..
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;
}
}

问题 现在;必须设置什么默认值才能避免询问委托(delegate)值?

尝试了“public void SetAge(Client client, Func getAge = this.getAge)”,但没有成功。

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

提前致谢。

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

最佳答案

方法参数的默认值必须是编译时常量。写作 default(Func<...>)只是 null 的详细语法,这是引用类型的默认值(作为委托(delegate),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);
}

关于c# - 委托(delegate)的默认参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com