MrC*_*lan 9 c# syntax delegates optional-parameters
在C#中,我们可以提供参数的默认值:
void Foo(int i =0) {}
Run Code Online (Sandbox Code Playgroud)
但是,当方法签名是:
void FooWithDelegateParam(Func<string,string> predicate)
{}
Run Code Online (Sandbox Code Playgroud)
我们如何传递默认参数:
void FooWithDelegateParam(Func<string,string> predicate = (string,string x)=> {return y;})
{}
Run Code Online (Sandbox Code Playgroud)
但这不会编译.那么,这样做的正确语法是什么?
注意:我正在尝试提供一种通过委托为输出字符串映射器指定输入字符串的方法,如果没有提供,我只想返回输入字符串.因此,对于实现这一目标的任何替代方法的建议也受到高度赞赏.谢谢.
Jon*_*eet 14
基本上你不能.参数的默认值必须是编译时常量.但是,如果您乐意使用null值作为"使用默认值"的值,您可以:
void FooWithDelegateParam(Func<string, string> predicate = null)
{
predicate = predicate ?? (x => x);
// Code using predicate
}
Run Code Online (Sandbox Code Playgroud)
或者根据Alireza的建议使用过载,当然.
利弊:
null和"默认".这本身就有利有弊:
null值,过载版本可以找到的bug在那里的偶然这样做null通过多个层传递" 默认值"值,只允许最底层layer确定默认实际意味着什么,并且这样做比简单地调用不同的重载更简单您不能这样指定默认值。改为编写一个重载:
void FooWithDelegateParam()
{
FooWithDelegateParam(s => s);
}
void FooWithDelegateParam(Func<string,string> predicate)
{
}
Run Code Online (Sandbox Code Playgroud)