为什么我的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);

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

最初的错误是重载解析失败。然后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