没有声明的Lambda表达式?

时间:2014-08-10 23:06:17

标签: c# lambda expression

来自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
}


为什么我要这样做?
我希望将条件复杂化为单个表达式。但我不想膨胀我的类或添加某种辅助类/什么,因为它不会在另一个范围内使用。

2 个答案:

答案 0 :(得分:6)

  

是否可以在不声明代理的情况下执行相同操作?

不,在没有首先声明类型的情况下,无法创建lambda表达式。委托就像C#中的任何其他对象一样:它必须具有明确定义的类型才能为其赋值。

但是,可能不需要自己声明类型,因为Microsoft已经为您宣布了大量的类型。如果其中一个预定义的委托类型适合您,请随意使用它们。

例如,如果您的委托占用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 :(得分:-1)

您正在寻找Func<*>代表:

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