以下代码给出错误
并非所有代码路径都返回type的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);
答案 0 :(得分:2)
原始错误是重载解析失败。然后C#编译器有一些启发式方法试图找出重载决策失败的原因,在这种情况下,这些启发式方法并没有告诉你“正确”的原因。
首先看一下可用的两个参数重载:
public ActionBlock(Action<TInput> f, ExecutionDataflowBlockOptions o);
public ActionBlock(Func<TInput, Task> f, ExecutionDataflowBlockOptions o);
在这两种情况下,第二个参数都是ExecutionDataflowBlockOptions
。但是你提供的DataflowBlockOptions
是ExecutionDataflowBlockOptions
的基类。由于基类不能隐式转换为派生类,因此重载解析失败。一旦创建了正确的选项,您的代码就可以运行。
Eric Lippert在重载解析失败时编译错误启发式的相关答案:Passing lambda functions as named parameters in C#
答案 1 :(得分:0)
尝试创建,
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