Fra*_*ser 23 c# lambda optional-parameters
有没有办法在c#中使用带有lambda表达式的可选参数(默认参数)?我已经阅读了文档,但却无法找到任何方式.
为了说明,我可以定义使用可选参数提供默认值的简单方法,如下所示:
void MyMethod(string arg = "default-value")
{
Console.WriteLine(arg);
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果我能够使用lambda表达式做同样的事情.
// gives a syntax error
Action<string> MyMethod = (arg = "default") => Console.WriteLine(arg);
Run Code Online (Sandbox Code Playgroud)
我可以使用委托使用默认值的可选参数,但这看起来有点笨拙.
delegate void MyDelegate(string arg = "default");
MyDelegate MyMethod = arg => Console.WriteLine(arg);
Run Code Online (Sandbox Code Playgroud)
或者我可以检查lambda体中的参数,比如...
Action<string> MyMethod = (arg) => Console.WriteLine(string.IsNullOrEmpty(arg) ?
"default" :
arg);
Run Code Online (Sandbox Code Playgroud)
但这再次看起来有点笨拙.
是否可以使用可选参数在c#中的lambda表达式中设置默认值?
Jon*_*eet 25
否.调用者(调用委托的代码)不"看到"lambda表达式,因此在那里指定默认参数没有意义.所有来电者都看到了代表.在您的情况下,例如,调用代码只知道Action<string>- 编译器如何知道提供lambda表达式指定的默认值?
作为事情变得棘手的一个例子,想象一下这是否可行.然后考虑这段代码:
Action<string> action;
if (DateTime.Today.Day > 10)
{
action = (string arg = "boo") => Console.WriteLine(arg);
}
else
{
action = (string arg = "hiss") => Console.WriteLine(arg);
}
action(); // What would the compiler do here?
Run Code Online (Sandbox Code Playgroud)
请记住,参数是由编译器在调用站点提供的 - 那么它应该如何处理最后一行呢?
这有点像有一个接口和一个实现 - 如果你在接口上有一个默认参数,那很好; 如果你只在实现上有它,那么只有知道具体实现的调用者才能看到它.在lambda表达式的情况下,调用者实际上没有可见的实现:只有委托签名.
| 归档时间: |
|
| 查看次数: |
8588 次 |
| 最近记录: |