首页 > 解决方案 > 无法推断 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.
}

提前致谢!

标签: c#lambda

解决方案


Select方法期望其中的 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?

所以你可以看到它是如何行不通的。

一旦你将它更新为 call 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"

推荐阅读