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

本文关键字:默认 参数 表达式 是否 lambda | 更新日期: 2023-09-27 17:51:06

是否有一种方法可以在c#中使用lambda表达式的可选参数(默认参数)?我已经通读了文档,但找不到任何可说的

为了说明这一点,我可以定义一个简单的方法,使用一个可选参数来提供一个默认值,如下所示:
void MyMethod(string arg = "default-value")
{ 
    Console.WriteLine(arg);
}

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

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

我可以使用委托在可选参数中使用默认值,但这似乎有点笨拙。

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

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

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

但是这看起来又有点笨拙。

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

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

No。调用者(调用委托的代码)没有"看到"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?
请记住,参数是由编译器在调用位置提供的——那么它应该如何处理最后一行呢?

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

lambda将匹配它被分配给的委托的签名;如果不将lambda分配给委托,则无法编译。

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

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

请记住,ActionFunc并不是特别特别,它们只是每个人都使用的两个委托,这样他们就不需要为每件小事都创建自己的委托。