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

时间:2014-07-27 06:58:22

标签: c# syntax delegates optional-parameters

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

void Foo(int i =0) {}

但是,当方法签名是:

void FooWithDelegateParam(Func<string,string> predicate)
{}

我们如何传递默认参数:

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

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

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

2 个答案:

答案 0 :(得分:13)

基本上你不能。参数的默认值必须是编译时常量。但是,如果您乐意使用null作为值含义&#34;请使用默认值&#34;你可以:

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

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

利弊:

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

答案 1 :(得分:2)

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

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

void FooWithDelegateParam(Func<string,string> predicate)
{

}