0

タイトルが紛らわしいと思いますので、よろしければ編集お願いします。私がこれを行うとき:

var q  = (condition)?(from ...Select(..)): (from.. Select(..));

「:」でエラーが発生します

Type of conditional expression could not be determined because 
there is no implicit conversion between anonymous types. 

しかし、もしそうなら:

var b = some base linq query;
var q = (condition)?(use b here one way):(use b here differently);

苦情はありません。なんで?2番目の方法はどう違うのですか?

編集:

どこでも、私の最終的な予測は同じです。(Final .Select(....) どこでも同じフィールドがあります)

編集2:

申し訳ありません..私の側のタイプミスです。どこでも Select() は同じではありませんでした。投影が「一致」する場合、方法 1 も正常に機能します。

4

3 に答える 3

2

条件式では、評価する 2 つのオペランドが同じ型である必要があります。だからあなたがするなら

var a = (condition)? "A" : "B";

... "A" と "B" はどちらも同じ型 (文字列) であるため、結果はa, 型になりstringます。

エラー メッセージが伝えているのは、2 つのオペランド (2 つのfrom ... Selectステートメント) が匿名型に評価されますが、同じ匿名型ではなく、ある匿名型を別の型に変換できないということです。したがって、結果がどのタイプになるべきかわかりませんq

100% 確実ではありませんが、2 つの式がまったく同じであっても、異なる匿名型になると思います。とにかく、そのエラーが発生したという事実は、それらが同じ匿名型ではないことを示しています。

2 番目のステートメント セットでは、最初bに linq クエリの結果と等しくなるように設定します。したがって、型があります。あなたのステートメントはそう言っていますが、コードがコンパイルされるという事実はそれを意味し、同じタイプの結果を返します(use b here one way)(use b here differently)たとえば、両方が と同じ型のインスタンスを返す場合b、それらは同じ型になります。

于 2013-03-28T21:18:32.777 に答える
2

エラーメッセージがこれを説明していると思います:

匿名型間の暗黙的な変換がないため、条件式の型を判別できませんでした。

これ

var x = 0 < 2 ? new { a = 1 } : new { a = 2 }

コンパイルします。でもこれは

var x = 0 < 2 ? new { a = 1 } : new { b = 2 };

とは同じ匿名型ではないため、上記のエラーが発生し {a=1}ます。{b=2}

于 2013-03-28T21:18:48.563 に答える
2

LINQ クエリの後にキャストを行った場合は、すべて問題ありません。

あなたが得るのと同じ問題のようなもので、次のようなことをします

int? val = true ? 1 : null;

それはうまくいきませんが、次のように null をキャストすると:

int? val = true ? 1 : (int?)null;

します。

于 2013-03-28T21:17:01.790 に答える