2012-06-07 47 views
3

很多語句(通常在Linq中看到)在編譯或執行時不需要使用TSource。爲什麼要指定TSource?Linq聲明中的TSource有什麼意義?

例子:

List<int> list = new List<int>(5) { 0, 1, 2, 0, 3 }; 

int x = list.Where<int>(i => i == 0).FirstOrDefault<int>(); 
int y = list.Where(i => i == 0).FirstOrDefault(); 

如何做報表有什麼不同?

+1

你在看什麼樣的例子「在不需要時使用TSource」?我看到的大多數代碼*不會執行此操作; LINQ理解規範('where x.IsAlive')也變成'.Where(x => x.IsAlive)'')。 –

+0

有些人不介意編寫多餘的代碼,比如在'FirstOrDefault(predicate)'做的時候,顯式指定'var'會執行的類型,或者使用'Where(predicate)'後面的'FirstOrDefault'。誰知道這樣的人在想什麼;) – AakashM

回答

6

在這兩個LINQ語句中都需要TSource類型。

它只是在第一條語句中明確提供,並且在第二條中隱含地推斷出

在編譯器無法推斷出類型的情況下(通常是lambda嵌套且非常複雜時),您會指定TSource

此外,如果您希望操作使用lamdba中使用的超類型進行。例如,如果AppleFruit繼承,則可以指定Fruit類型而不是讓它推斷Apple

最後,您可以選擇指定(或不指定)TSource,以使代碼更具可讀性 - 可以通過明確包含類型或刪除冗餘類型重複。

+0

但是,爲什麼要指定TSource呢? – usr

1

因爲有時(我的意思是有時候)如果我們沒有定義TSource,那麼它就無法檢測到它的使用類型,即它的lambda表達式。

如果我們不提供TSource,有時候我們沒有得到這個錯誤。

在你的情況下,如果我們不提供它,那就OK了。

1

通常它是完全多餘的,並沒有達到任何真正的目的。我懷疑像重構引擎這樣的代碼工具會添加通用參數,即使不是必需的。

Resharper標記爲冗餘,我通常刪除它們。他們不會添加有價值的信息,也不會(通常)記錄重要的事情。

+0

這並不是說參數本身是多餘的,只是該值可以被暗示(明確地聲明它是多餘的)。那裏有一點我認爲你沒有說清楚。 –

相關問題