为什么我的lambda报告“并非所有代码路径都返回值”?
本文关键字:路径 代码 返回值 lambda 我的 报告 为什么 | 更新日期: 2023-09-27 18:16:49
下面的代码给出一个错误
不是所有的代码路径都返回类型为lambda表达式的值"System.Func"。
突出显示line =>
。不知道为什么?
var ui = new DataflowBlockOptions();
ui.TaskScheduler = TaskScheduler.Current;
ui.BoundedCapacity = 1;
ui.MaxMessagesPerTask = 1;
ActionBlock<string> tradeSignalLog = new ActionBlock<string>(line =>
{
Console.WriteLine(line);
}, ui);
最初的错误是重载解析失败。然后c#编译器有一些启发式方法,试图找出重载解析失败的原因,在这种情况下,这些启发式方法并没有告诉你"正确"的原因。
首先看看可用的两个参数重载:
public ActionBlock(Action<TInput> f, ExecutionDataflowBlockOptions o);
public ActionBlock(Func<TInput, Task> f, ExecutionDataflowBlockOptions o);
两种情况下第二个参数都是ExecutionDataflowBlockOptions
。但你提供DataflowBlockOptions
,它是ExecutionDataflowBlockOptions
的基类。由于基类不能隐式地转换为派生类,因此重载解析失败。一旦你创建了正确的选项,你的代码就可以工作了。
Eric Lippert对重载解析失败时编译器错误启发式的相关回答:在c#中将lambda函数作为命名参数传递
尝试创建
Action<string> action = line => Console.WriteLine(line);
ActionBlock<string> tradeSignalLog = new ActionBlock<string>(action, ui);
看看这是否还不能解决你的问题。似乎编译器正在解释您的代码并期望Func<>
如下:http://msdn.microsoft.com/en-us/library/hh194684(v=vs.110).aspx