有人可以帮助我理解下面的示例中的实际情况,以便将来我可以为自己钓鱼 ..了解错误的原因或解决方法无需简单地重写...
使用此方法:
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.
}
谢谢!
答案 0 :(得分:5)
Select
method期望其中的lambda表达式返回值。由于DoNothing(v)
是void
方法,因此它根本不返回任何内容。
该错误消息来自通用推断,在该通用推断中,它会尝试,根据其中的表达式结果来确定通过调用Select
产生的变量的类型。但是由于没有返回类型(void
不算在内),所以会抱怨。
想象一下,如果您在其上链接了另一个Select
或Where
调用:
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));