为什么我的lambda报告“并非所有代码路径都返回值”?

时间:2011-12-06 06:40:20

标签: c# delegates lambda overload-resolution

以下代码给出错误

  

并非所有代码路径都返回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);

2 个答案:

答案 0 :(得分:2)

原始错误是重载解析失败。然后C#编译器有一些启发式方法试图找出重载决策失败的原因,在这种情况下,这些启发式方法并没有告诉你“正确”的原因。

首先看一下可用的两个参数重载:

public ActionBlock(Action<TInput> f, ExecutionDataflowBlockOptions o);
public ActionBlock(Func<TInput, Task> f, ExecutionDataflowBlockOptions o);

在这两种情况下,第二个参数都是ExecutionDataflowBlockOptions。但是你提供的DataflowBlockOptionsExecutionDataflowBlockOptions的基类。由于基类不能隐式转换为派生类,因此重载解析失败。一旦创建了正确的选项,您的代码就可以运行。

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