是否可以在c#中的lambda表达式中使用可选/默认参数?

有没有办法在c#中使用带有lambda表达式的 可选参数 (默认参数)? 我已经阅读了文档,但却找不到任何说法。

为了说明,我可以定义使用可选参数提供默认值的简单方法,如下所示:

void MyMethod(string arg = "default-value") { Console.WriteLine(arg); } 

我想知道的是,如果我能够使用lambda表达式做同样的事情。

 // gives a syntax error Action MyMethod = (arg = "default") => Console.WriteLine(arg); 

我可以使用委托使用默认值的可选参数,但这看起来有点笨拙。

 delegate void MyDelegate(string arg = "default"); MyDelegate MyMethod = arg => Console.WriteLine(arg); 

或者我可以检查lambda体中的参数,例如…

  Action MyMethod = (arg) => Console.WriteLine(string.IsNullOrEmpty(arg) ? "default" : arg); 

但这再次看起来有点笨拙。

是否可以使用可选参数在c#中的lambda表达式中设置默认值?

否。调用者(调用委托的代码)不会“看到”lambda表达式,因此在那里指定默认参数没有意义。 所有来电者都看到了代表。 在您的情况下,例如,调用代码知道Action – 编译器如何知道提供lambda表达式指定的默认值?

作为事情变得棘手的一个例子,想象一下这是否可行。 然后考虑这段代码:

 Action 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? 

请记住,参数是由编译器在调用站点提供的 – 那么它应该如何处理最后一行呢?

这有点像有一个接口和一个实现 – 如果你在接口上有一个默认参数,那很好; 如果你只在实现上有它,那么只有知道具体实现的调用者才能看到它。 在lambda表达式的情况下,调用者实际上没有可见的实现:只有委托签名。

lambda将匹配它所分配的委托的签名; 没有被分配给委托,lambda无法编译。

如果委托包含可选参数,那么使用该委托可以选择提供参数。 如果委托没有,那么使用该委托不能省略任何参数。

虽然ActionFunc委托非常方便,并且可以代表大多数签名,但它们不能代表任何带有可选参数的签名; 你必须使用另一个委托定义。

Remeber, ActionFunc并不是特别特别,他们只是每个人都使用的两个代表,所以他们不需要担心为每件小事创建自己的代表。