1

下面的代码给出了一个错误

并非所有代码路径都返回“System.Func”类型的 lambda 表达式中的值。

它突出显示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);
4

2 回答 2

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#

于 2011-12-09T22:57:52.773 回答
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

于 2011-12-09T22:24:15.090 回答