【问题标题】:Is it possible to use optional/default parameters in a lambda expression in c#?是否可以在 c# 的 lambda 表达式中使用可选/默认参数?
【发布时间】:2012-12-24 07:55:21
【问题描述】:

有没有办法在c#中使用optional arguments(默认参数)和lambda expressions?我已经阅读了文档,但找不到任何可以说的方式。

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

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表达式中设置默认值?

【问题讨论】:

  • 这没有意义。无论如何,你不能在没有参数的情况下调用Action&lt;String&gt;
  • @KonstantinVasilcov - 它根本不是重复的 - 我专门询问 lambda 表达式 - 不是简单的方法。我想我已经说清楚了,抱歉。
  • @SLaks 这就是我要问的 - 参数可以是可选的吗?你也不能在没有参数的情况下调用Method(string arg),但如果你这样做了Method(string arg = "default")
  • @Fraser:是的,但这是由您调用的签名定义的。我的观点是,将Action&lt;string&gt; 指向的东西更改为不能 使其合法。

标签: c# lambda optional-parameters


【解决方案1】:

没有。调用者(调用委托的代码)没有“看到” lambda 表达式,因此在那里指定默认参数是没有意义的。调用者看到的只是委托。例如,在您的情况下,调用代码知道Action&lt;string&gt; - 编译器如何知道提供由 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 表达式的情况下,调用者实际上没有可见的实现可供使用:只有委托签名。

【讨论】:

  • +1 谢谢,这确实有道理。我真的只是在尝试一些东西,起初它似乎应该可以工作......
【解决方案2】:

无论分配给它的委托的签名是什么,lambda 都会匹配;如果没有分配给委托,则 lambda 无法编译。

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

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

请记住,ActionFunc 并不是特别特别,它们只是每个人都使用的两个代表,因此他们不必担心为每件小事创建自己的代表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多