52

通常、条件演算子を使用する場合の構文は次のとおりです。

int x = 6;
int y = x == 6 ? 5 : 9;

派手なことは何もなく、かなり簡単です。

では、Lambda を Func 型に割り当てるときにこれを使用してみましょう。説明させてください:

Func<Order, bool> predicate = id == null
    ? p => p.EmployeeID == null
    : p => p.EmployeeID == id;

それは同じ構文であり、動作するはずですか? 右?どういうわけかそうではありません。コンパイラは、次のような不可解なメッセージを表示します。

エラー 1 'ラムダ式' と 'ラムダ式' の間に暗黙的な変換がないため、条件式の型を特定できません

次に、構文を変更したところ、次のように機能ました。

Func<Order, bool> predicate = id == null
    ? predicate = p => p.EmployeeID == null
    : predicate = p => p.EmployeeID == id;

なぜ最初の方法でうまくいかないのか不思議です。

(補足: int 値と null を比較するときは、object.Equals を使用するだけであることがわかったため、このコードは不要になりました)

4

4 に答える 4

54

ラムダ式を特定のターゲット デリゲート型に変換できますが、条件式の型を判断するために、コンパイラは 2 番目と 3 番目のオペランドのそれぞれの型を知る必要があります。どちらも単なる「ラムダ式」ですが、一方から他方への変換はないため、コンパイラは何も役に立ちません。

ただし、割り当てを使用することはお勧めしません-キャストはより明白です:

Func<Order, bool> predicate = id == null 
    ? (Func<Order, bool>) (p => p.EmployeeID == null)
    : p => p.EmployeeID == id;

コンパイラが他のラムダ式から変換を実行できるように、オペランドを 1 つだけ指定する必要があることに注意してください。

于 2008-11-04T19:45:18.927 に答える
5

C# コンパイラは、最初に 3 項を処理してから代入を処理するため、作成されたラムダ式の型を推測できません。あなたもできる:

Func<Order, bool> predicate = 
    id == null ? 
        new Func<Order,bool>(p => p.EmployeeID == null) :
        new Func<Order,bool>(p => p.EmployeeID == id);

しかし、それはひどいです、あなたも試すことができます

Func<Order, bool> predicate = 
    id == null ? 
        (Order p) => p.EmployeeID == null :
        (Order p) => p.EmployeeID == id;
于 2008-11-04T19:46:58.877 に答える