2012-06-22 69 views
4

我有這樣的代碼:VAR如何確定對多種選擇?

IEnumerable<string> q = customers /*EF entity*/ 
.Select (c => c.Name.ToUpper()) 
.OrderBy (n => n) 

要選擇實體,ObjectContext的實際創建的ObjectQuery,這 實現IQueryable的。從的ObjectQuery對象的回報,是不是 普通對象,但EntityObject

,但如果我寫:(注意var

var q = customers /*EF entity*/ 
.Select (c => c.Name.ToUpper()) 
.OrderBy (n => n) 

可以確定既ienumerableiqueryable

因爲ObjectQuery另外實施IEnumerable ...

我不知道是否有任何具體的信息,告訴編譯器「使用的,而不是B.一個更具體的...」(必須有...我只是不能找到它)

enter image description here

有幫助嗎?它將如何知道使用A || B?

+0

一種簡單的方法可以告訴Type var在Visual Studio中使用的是將鼠標懸停在var關鍵字上,並且彈出窗口會告訴您它是什麼類型。 C#深入介紹了C#中類型推理的工作原理。 –

+0

@EricAndres我有resharper哪些做了更好的工作:)...我只是想了解如何作出決定:)感謝人 –

回答

4

IQueryable<T> itself inherits from IEnumerable<T>,所以它比IEnumerable<T>更具體,儘管ObjectQuery<T>實現了兩個通用接口。

+0

,但是當編譯器看到客戶/ * EF實體*/ 。選擇c => c.Name.ToUpper()) .OrderBy(n => n)'......它是否總是在繼承的最低鏈中向上看? –

+0

@RoyiNamir:是的。如果有兩個方法具有相同的簽名,但是一個接口或類型可以擴展另一個接口或類型,編譯器將選擇使用更具體參數的重載,除非您顯式強制該參數不那麼具體(例如,通過AsEnumerable ()'擴展方法)。 – StriplingWarrior

+0

如果1個方法接受int並且另一個接受object - 決定將在編譯時關於編譯時間的類型,所以如果我寫'int i = 3; doWork(i)'doWork的int版本將會運行。如果我發送'對象我= 5; doWork(i)'doWork的對象版本將運行.......但是這裏我沒有**任何編譯時間類型......所以他怎麼做呢? –