13

在此代码片段中:

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)是,为什么?

4

3 回答 3

16

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

这是一个有效的转换:

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

换句话说,两者

Print("something");

int x = Print("something");

是该Print方法的正确用法;它们可以以相同的方式在 lambdas 中使用。

于 2012-10-13T02:32:32.750 回答
10

x => Print(x)是一个 lambda,它在这里变成了一个方法,相当于:

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

如果上下文要求 a 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>

于 2012-10-13T02:32:40.913 回答
4

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

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

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

于 2012-10-13T03:07:16.840 回答