私は方法があります:到達できないコードを追加せずにこの非同期ラムダをコンパイルするにはどうすればよいですか?
void MyMethod<T>(params Func<T>[] funcs) { }
私は非同期ラムダでそれを呼び出すようにしたい:
MyMethod(async() => 1, async() => 2, async() => 3);
それは働きます!しかし、3番目のラムダが例外をスローするようにしたいのですが?上記
MyMethod(async() => 1, async() => 2, async() => { throw new Exception(); });
コンパイルされませんが、それは、2つの同一のエラー得られます。
CS0201のみ代入、インクリメント、デクリメント、呼び出し、新しいオブジェクト式がステートメントとして使用することができますが
なぜこのエラーが出るのか分かりませんが、コンパイルできない理由を理解しています。最初の2つのラムダはFunc<Task<int>>
ですが、最後はFunc<Task>
です。私はそれが私により良いコンパイルエラーを与えると期待していますが、この問題を脇に置いてみましょう。
コンパイルするにはどうすればよいですか?私はおそらく、3番目の非同期ラムダのために生成したいタスクのタイプをコンパイラに伝えなければならないでしょう。私が見つけた一つの方法は、throw
文の後return
文を指定するには、次のとおりです。
MyMethod(async() => 1, async() => 2, async() => { throw new Exception(); return 3; });
別に醜いと紛らわしいことから、それはコンパイラ警告を生成:
を検出しましたCS0162到達不能コードが
コンパイラを幸せにする方法を教えてください。到達不能なコードをコンパイルするのを避けるにはどうすればよいですか?非同期ラムダによって返されるタスクの種類を指定する別の方法はありますか?
また、上記の例でCS0201エラーが発生するのはなぜですか?
なぜあなたは 'await'を使用していないことを考えると、最初の場所で非同期ラムダを使用していますか? – Servy
@Servy:実際のコードは待っています。例外をスローする3番目のラムダでさえ待っています。これは、コードを削除したものです。 –
実際のコードを実際に表す例を示します。 – Servy