2011-12-09 23 views
4

的LINQ的IList接口VS混凝土現在

IList<string> listOfStrings = (new string[] { "bob","mary"}); 

我們不能瓶坯

listOfStrings.ToList().ForEach(i => i.DoSome(i))); 

我們需要重塑的具體實現接口的

List<string> listOfStrings = ((new string[] { "bob","mary"}).ToLIst(); 

然後我們可以做a每個

listOfStrings.ForEach(i => i.DoSome(i))); 

這是因爲foreach操作符不能與IList接口一起工作,爲什麼這樣?

回答

8

你不使用foreach運營商 - 您使用的是ForEach方法,這是在List<T>(here)也爲arrays聲明。 IList<T>IEnumerable<T>上沒有這種擴展方法。你可以寫一個,但我個人會使用一個真正的foreach循環:

foreach (var text in listOfStrings) 
{ 
    ... 
} 

見埃裏克利珀的博客post on the topic對於那些不是我的更清晰的想法。

3

ForEach方法是List<T>.ForEach。這不是在IList<T>上定義的方法。


然而,你的第一個例子實際上做的工作:

listOfStrings.ToList().ForEach(i => i.DoSome(i))); 

Enumerable.ToList方法返回一個List<T>,這使得以上實際工作的罰款。

你不能這樣做,但是:

//將無法在編譯時 listOfStrings.ForEach(I => i.DoSome(I)));

由於這是直接使用IList<T>,它沒有定義ForEach方法。