[英]conditional linq query behavior
我覺得標題有誤導性,請選擇編輯。 當我這樣做時:
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);
沒什么好抱怨的。 為什么? 第二種方式有何不同?
編輯:
在任何地方,我的最終預測都是相同的。 (最后的.Select(....)處都有相同的字段)
編輯2:
我很抱歉..我的錯字。 各地的Select()都不一樣。 如果投影“匹配”,方法1也可以正常工作
如果您在LINQ查詢之后進行了強制轉換,一切都會好起來的。
你遇到的同樣的問題,然后做類似的事情
int? val = true ? 1 : null;
那是行不通的,但是如果您將null像這樣轉換:
int? val = true ? 1 : (int?)null;
是的
條件表達式需要它評估的兩個操作數為相同類型。 所以如果你這樣做
var a = (condition)? "A" : "B";
...“ A”和“ B”都是相同的類型(字符串),因此結果a
將是string
類型。
您的錯誤消息告訴您,您的兩個操作數( from ... Select
語句的兩個)求值為匿名類型,但不是相同的匿名類型,並且無法將一種匿名類型轉換為另一種匿名類型。 因此,它不知道結果q
應該是什么類型。
盡管我不確定100%,但我相信即使您的兩個表達式完全相同,它們也將是不同的匿名類型。 無論如何,您收到該錯誤的事實表明它們不是同一匿名類型。
使用第二組語句,首先將b
設置為等於linq查詢的結果。 因此它具有一種類型。 盡管您的聲明確實如此,但是代碼編譯的事實意味着(use b here one way)
(use b here differently)
(use b here one way)
和(use b here differently)
(use b here one way)
(use b here differently)
返回相同類型的結果。 例如,如果它們都返回與b
類型相同的實例,則它們將具有相同的類型。
它認為錯誤消息解釋了這一點:
由於匿名類型之間沒有隱式轉換,因此無法確定條件表達式的類型。
這個
var x = 0 < 2 ? new { a = 1 } : new { a = 2 }
會編譯。 但是這個
var x = 0 < 2 ? new { a = 1 } : new { b = 2 };
會出現上述錯誤,因為{a=1}
和{b=2}
不是相同的匿名類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.