この質問は、ほぼ毎日何らかの形で尋ねられます。
条件付き演算子タイプの分析は、外側から内側ではなく、内側から外側に進みます。条件演算子は、結果がどのタイプに割り当てられているかを知らないため、結果とそれらのタイプの代替を強制します。それは反対のことをします。結果と代替のタイプを計算し、これら2つのタイプのより一般的なものを取得してから、一般的なタイプが割り当てられる可能性があることを確認します。
結果と代替には、ラムダのタイプがどうあるべきかについての情報が含まれていないため、条件のタイプを推測することはできません。したがって、割り当てが正しいことを確認できません。
言語がそのように設計された理由を考えることは啓発的です。オーバーロードがあるとします。
void M(Func<string, int> f) {}
void M(Func<double, double> f) {}
と電話
M( b ? n=>n.Foo() : n => n.Bar() );
タイプが外部から内部に推測される世界で、過負荷解決がMのどの過負荷が選択されるかをどのように決定するかを説明します。
今これを考えてみましょう:
M( b1 ? (b2 ? n=>n.Foo() : n => n.Bar() ) : (b3 ? n=>n.Blah() : n=>n.Abc()) );
難しくなりませんか?ここで、Foo、Bar、Blah、およびAbc自体が関数を使用するメソッドであり、ラムダを含む条件演算子を使用した引数があることを想像してみてください。
対応する大きな利点がなければ、型推論プロセスをそれほど複雑にしたくはありません。また、条件演算子にはそのような大きな利点はありません。
あなたの場合にあなたがすべきことは、結果と特定のタイプの代替の一方または両方をキャストすることです。