无法推断Lambda表达式类型参数

时间:2018-11-07 16:31:57

标签: c# lambda

有人可以帮助我理解下面的示例中的实际情况,以便将来我可以为自己钓鱼 ..了解错误的原因或解决方法无需简单地重写...

使用此方法:

public static void DoNothing(string v)
{
    // do nothing
}

尝试以这种方式执行它,将产生错误“ 无法推断方法..的类型参数。尝试显式指定类型参数。”:

myList.Select(x => DoNothing(x)); // does not work
var r = myList.Select(x => DoNothing(x)); // just a ?

但是,一旦返回内容,即:

private static string ReturnString(string v)
{
    return v;
}

这很好:

myList.Select(x => ReturnString(x)); // works
var r = myList.Select(x => ReturnString(x)); // IEnumerable<string>

所以我想这与void返回类型有关吗?

由于什么都没有返回的事实,或者是否缺少一些不可思议的语法(/!),我无法工作吗!

我似乎只能使它起作用的唯一方法如下:

foreach (var item in myList)
{
    DoNothing(item);    // works fine.
}

谢谢!

2 个答案:

答案 0 :(得分:5)

Select method期望其中的lambda表达式返回值。由于DoNothing(v)void方法,因此它根本不返回任何内容。

该错误消息来自通用推断,在该通用推断中,它会尝试,根据其中的表达式结果来确定通过调用Select产生的变量的类型。但是由于没有返回类型(void不算在内),所以会抱怨。

想象一下,如果您在其上链接了另一个SelectWhere调用:

myList.Select(x => DoNothing(x)).Where(v => ????); //what is "v" here? void? That doesn't work

var value = myList.Select(x => DoNothing(x)).First(); //what is "value" here? void?

因此,您可以看到它如何工作。

一旦将其更新为调用ReturnString,就可以根据string返回类型进行推断,一切都很好。

myList.Select(x => ReturnString(x)).Where(v => v == "Hello World!"); // "v" is a string here, everything is fine.

string value = myList.Select(x => ReturnString(x)).First(); //what is "value" here? It's a "string" type as specified by "ReturnString"

答案 1 :(得分:0)

除了克里斯的答案外,您还可以使用LINQ的ForEach方法维护当前语法(假设myList 实际上是一个列表)。

myList.ForEach(x => DoNothing(x));