2012-07-20 41 views
1

我有這樣的代碼:爲什麼我無法在.ToList後訪問Count屬性()

var numbers = new []{ 1,2,3 }; 
IEnumerable<int> evenNumbers = numbers.Where(i=> i % 2 == 0); 

現在我把這個「收集」到列表:

evenNumbers = evenNumbers.ToList(); 

爲什麼現在我只能做evenNumbers.Count()而不是evenNumbers.Count

有了:

IList<int> evenNumbers = numbers.Where(i=> i % 2 == 0).ToList(); 

我可以。不會'evenNumbers = evenNumbers.ToList();實現IEnumerable成List?

回答

1

對於您的編譯器,evenNumbers仍然是IEnumerable類型。你的編譯器不知道它實際上是一個List。如果您爲其派生類型的對象分配了變量,那麼'evenNumbers'的類型不會更改。

+0

因此,它成爲一個列表,但我不能用它作爲一個列表? :O – markzzz 2012-07-20 13:05:02

+0

@markzzz讓我們做一個極端的例子:'object o = evenNumbers.ToList()';你認爲你可以做'o.Count'或'o.Count()'?不,因爲C#編譯器不知道「o」對象中的內容,並且C#是靜態鏈接的(忽略C#4.0'dynamic'對象) – xanatos 2012-07-20 13:21:14

+0

說「在運行時進行某種類型的轉換」 ?大聲笑。你有關於這種行爲的任何教程嗎? – markzzz 2012-07-20 13:40:21

1

evenNumbers變量在賦值後仍然是IEnumerable<int>。您應該創建一個新的變量類型IList<int>List<int>以使用Count屬性,因爲它在IList<T>接口中定義。這就是你在第二次任務中所做的。

相關問題