如何在C#中为委托类型的参数提供默认值?

在C#中,我们可以提供参数的默认值:

void Foo(int i =0) {} 

但是,当方法签名是:

 void FooWithDelegateParam(Func predicate) {} 

我们如何传递默认参数:

 void FooWithDelegateParam(Func predicate = (string,string x)=> {return y;}) {} 

但这不会编译。 那么,这样做的正确语法是什么?

注意:我正在尝试提供一种通过委托为输出字符串映射器指定输入字符串的方法,如果没有提供,我只想返回输入字符串。 因此,对于实现这一目标的任何替代方法的建议也受到高度赞赏。 谢谢。

基本上你不能。 参数的默认值必须是编译时常量。 但是,如果您乐意使用null作为值,意味着“使用默认值”,您可以:

 void FooWithDelegateParam(Func predicate = null) { predicate = predicate ?? (x => x); // Code using predicate } 

或者根据Alireza的建议使用过载,当然。

利弊:

  • 过载解决方案适用于不支持可选参数的语言(例如4.0之前的C#)
  • 重载解决方案区分null和“default”。 这本身就有利有弊:
    • 如果调用者永远不应该提供null值,那么重载版本可以发现它意外地发生的错误
    • 如果您不相信会有任何此类错误,可选参数版本允许在代码中表示“默认” – 您可以通过多个层传递“ null含义默认值”,只允许底部 -大多数层确定默认实际意味着什么,并且这样做比简单地调用不同的重载更简单
  • 可选参数版本在界面中更易于表达…
    • ……缺点是缺省值仍需要在实现中表达。 (这在重载解决方案中有点常见,请注意……在这两种情况下,实现接口的抽象类都可以使用模板方法模式进行默认操作。)

您无法像这样指定默认值。 写一个重载:

 void FooWithDelegateParam() { FooWithDelegateParam(s => s); } void FooWithDelegateParam(Func predicate) { }