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.
}
提前致谢!
解决方案
该Select
方法期望其中的 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?
所以你可以看到它是如何行不通的。
一旦你将它更新为 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"
推荐阅读
- c++ - 为什么右值引用成员会是 const?
- c# - System.InvalidOperationException:未使用 GCHandle.FromIntPtr() 初始化句柄
- android - 连接到BLE设备后,我怎么知道有哪些服务可用,我只知道打印uuid但我想知道服务的名称
- android - 将渐变着色器应用于 LazyRow
- sql-server - 在触发器中使用动态 SQL 来识别更改
- python - 对字典理解中的列表求和
- reactjs - React 功能组件 - 同时使用回调和道具
- equation-solving - 给定边际表后解决列联表
- quickbase - 在 QuickBase 中,有没有办法将明细报表添加到公式字段?
- python - 如何跟踪用户输入的数量,并将它们显示在字符串中?