1

次のコードはエラーになります

すべてのコードパスが「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);
4

2 に答える 2

2

元のエラーは、過負荷の解決に失敗したことです。次に、C#コンパイラには、過負荷の解決が失敗した理由を解明しようとするヒューリスティックがいくつかあります。この場合、これらのヒューリスティックは「正しい」原因を教えてくれませんでした。

まず、使用可能な2つのパラメーターのオーバーロードを確認します。

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

2番目のパラメーターはExecutionDataflowBlockOptionsどちらの場合もです。ただしDataflowBlockOptions、の基本クラスであるaを指定しExecutionDataflowBlockOptionsます。基本クラスは暗黙的に派生クラスに変換できないため、過負荷の解決は失敗します。正しい種類のオプションを作成すると、コードが機能します。

コンパイラーに関するEricLippertの関連する回答-オーバーロード解決が失敗した場合のエラーヒューリスティック:ラムダ関数を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 に答える