2011-11-18 28 views
1

我有這個三元線路故障:三元操作故障與LINQ

var userFromContext = IsOwner ? db.Owners.Where(o => o.UserName == username) 
           : db.Users.Where(u => u.UserName == username); 

它給我這個錯誤消息:

無法確定條件表達式的類型,因爲之間不存在隱式轉換System.LINQ.IQueryable<Owners>System.LINQ.IQueryable<Users>

爲什麼要關心我是否將它分配給var變量?

+2

相關:[?var關鍵字運行時或編譯時(http://stackoverflow.com/questions/3632918/var -keyword-runtime-or-compile-time) –

+1

不要混淆javascript的var和csharp的var。事實上,除非必須使用csharp的var,否則(例如anon類型)。 –

回答

10

因爲變量必須是某種類型的。

var」並不意味着「無類型」。它的意思是「親愛的編譯器,請根據我指定的表達式來確定這個變量的類型應該是什麼」。

爲了做到這一點,編譯器必須首先了解表達式的類型,並且不能這樣做,因爲三元運算符的兩個分支是不同類型的。

+0

啊。我一直在想'var userFromContext = db.Users.Where(u => u.UserName == username);'自己工作,在評估條件之後確定它的類型不應該成爲問題。 – Ron

+1

@Ron,不,事實並非如此。 「var」不是一些新的閃亮功能,而是一個簡單的快捷方式;在保持其性質不變的情況下縮短代碼的一種方法。 –

3

三元運算符必須具有特定的常用返回類型。您可以通過將它們都投射到IEnumberable來解決此問題。

+0

如果'User'和'Owner'有一個共同的基類型,會自動解決嗎?如果不是,那麼你可以轉換爲'IEnumerable '。 –

3

因爲var只是靜態類型的佔位符。在編譯時的類型有。如果類型取決於數據,那麼編譯器無法知道它是什麼類型。而不是一個變種,使用dynamic關鍵字,如果你真的想使用上述構建:

dynamic userFromContext = IsOwner ? db.Owners.Where(o => o.UserName == username) 
            : db.Users.Where(u => u.UserName == username); 
+1

如果你使用'dynamic',那麼你將無法在路上使用LINQ操作符,因爲'dynamic'不能用於擴展方法。 –

+0

這是正確的,但我試圖保持類似於OP的原始結構 – flipchart