为什么lambdas可以将函数调用转换为Actions?

时间:2012-10-13 02:26:59

标签: c# .net c#-4.0

在此代码片段中:

List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Tom");
names.Add("Tim");
names.Add("Richard");

names.ForEach(x => Print(x));

private static string Print(string s)
{
    Console.WriteLine(s);
    return s;
}

Print肯定不是Action,因为它正在返回string;但x=> Print(x)是,为什么?

3 个答案:

答案 0 :(得分:16)

lambda表达式x => Print(x)的类型是根据其上下文确定的。由于编译器知道lambda已分配给Action<string>,因此编译器忽略Print(s)方法的返回类型,就好像它是语句表达式

这是有效的转换:

Action<string> myAction = y => Print(y);

换句话说,两者都是

Print("something");

int x = Print("something");

Print方法的正确用法;它们可以以同样的方式用于lambdas。

答案 1 :(得分:10)

x => Print(x)是一个lambda,它变成了一个等同于:

的方法
void MyPrintLambda(string x) { Print(x); }

如果上下文要求使用Func<string, string>,那就是:

string MyPrintLambda(string x) { return Print(x); }

或者如果它是Func<string, object>,那就是:

object MyPrintLambda(string x) { return Print(x); }

因为编译器可以通过简单地忽略返回类型(即第一个示例)将x => Print(x)转换为Action<string>,所以它可以编译。

答案 2 :(得分:4)

出于同样的原因,这是有效的:

foreach (string name in names)
{
    Print(name);
}

Print()方法也返回该代码中的值,但没有人会认为这是一个错误。允许只丢掉返回值。