Почему мой лямбда-отчет "Не все пути кода возвращают значение"? - PullRequest
1 голос
/ 06 декабря 2011

Следующий код выдает ошибку

Не все пути кода возвращают значение в лямбда-выражении типа '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 ]

2 голосов
/ 10 декабря 2011

Первоначальная ошибка в том, что разрешение перегрузки не удалось.Затем у компилятора C # есть некоторая эвристика, которая пытается выяснить, почему не удалось разрешить перегрузку, и в этом случае эти эвристики не сообщают вам «правильную» причину.

Сначала рассмотрим доступные перегрузки двух параметров:

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

Второй параметр ExecutionDataflowBlockOptions в обоих случаях.Но вы предоставляете DataflowBlockOptions, который является базовым классом ExecutionDataflowBlockOptions.Поскольку базовые классы не являются неявно конвертируемыми в производные классы, разрешение перегрузки завершается неудачно.Как только вы создадите правильный тип параметров, ваш код будет работать.

Соответствующий ответ Эрика Липперта об эвристике ошибок компилятора при сбое разрешения перегрузки: Передача лямбда-функций в качестве именованных параметров в C #

0 голосов
/ 10 декабря 2011

Попробуйте создать,

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...