【问题标题】:Lambda expression without declaration?没有声明的 Lambda 表达式?
【发布时间】:2014-08-10 23:06:16
【问题描述】:

来自 MSDN 的 Lambda 表达式示例

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}

是否可以在不声明委托的情况下做同样的事情?

好吧,既然我认为声明不是正确的词,我会按照我的意愿编写代码

static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}


我为什么要这样做?
我想将复杂的 if 条件简化为单个表达式。但我不想膨胀我的班级或添加某种帮助类/其他任何东西,因为它不会在另一个范围内使用。

【问题讨论】:

标签: c# lambda expression


【解决方案1】:

是否可以在不声明委托的情况下做同样的事情?

不,如果不先声明类型,就不可能创建 lambda 表达式。委托与 C# 中的任何其他对象一样:它必须具有明确定义的类型,然后才能为其赋值。

但是,可能不需要你自己声明类型,因为微软已经为你声明了很多类型。如果其中一种预定义的委托类型适合您,请随意使用它们。

例如,如果您有一个接受 0 到 16 个参数的委托,您可以使用 Action 委托类型之一:

Action x = () => DoStuff();
Action<int> x = i => DoStuff(i);
Action<string, string, string> = (a,b,c) => DoStuff(a,b,c);

如果需要返回值,可以使用Func 委托类型之一:

Func<int> x = () => 6;
Func<int, int> x = i => i * i;
Func<string, string, string, string> x = (a,b,c) => a.Replace(b, c);

等等。

还有很多:Windows 窗体或 WPF 中的每个控件事件都使用预定义的委托类型,通常是 EventHandlerRoutedEventHandler 或一些派生类。 Func 有专门的版本,例如 Predicate(尽管这些版本大多早于 LINQ,而且大多已过时)。

但是,如果出于某种奇怪的原因,没有一种内置委托类型适合您,那么是的,您需要先定义自己的委托类型,然后才能使用它。

【讨论】:

  • 嗯 - 很好的答案。谢谢你的解释。不幸的是,我只能给一个 +1 ;)
【解决方案2】:

您正在寻找Func&lt;*&gt; 代表:

Func<int, int> myDelegate = ...;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多