2012-09-06 72 views
4

我有2個實例:爲什麼.Concat方法的返回值類型看起來有點奇怪:System.Linq.Enumerable +(...)?

 foo and bar 

他們的類型有:

foo.GetType().ToString() 

回報: System.Collections.Generic.List`1 [MyNameSpace.MyClass]

bar.GetType().ToString() 

返回: System.Collections.Generic.List`1 [MyNameSpace.MyClass]

當我concatanate它們:

var foobar = foo.Concat(bar); 

對GetType()返回 System.Linq.Enumerable + d__71 `1 MyNameSpace.MyClass]

問題: 這是什麼意思?它不應該是IEnumerable?

回答

8

不要混淆聲明的返回類型和返回值的實際類型。 Concat被聲明爲返回IEnumerable<T>,但它實際上返回實現了IEnumerable<T>的具體類型的實例。 GetType返回具體類型,而不是聲明的返回類型。

至於怪異名稱,Concat與一個​​實現,並且迭代塊由編譯器變換爲與類型的名字,如實現IEnumerable<T>Enumerable+d__71

+0

所以如果IEnumerable 的返回值是預期的,並且如果我「返回foo.Concat(bar);」那應該沒問題?不需要「返回foo.Concat(bar).ToArray();」我對麼? – pencilCake

+0

@pencilCake - 你是對的,不需要'.ToArray()'。需要注意的是,如果你確實調用了'.ToArray()',它會在那個時候迭代並將所有結果放入一個新的'MyClass []'數組中。沒有'.ToArray()'調用,迭代器的執行是不同的。 – CodingWithSpike

+0

也許不符合上下文的問題,但如果WCF服務返回延遲查詢,這是否意味着客戶端將失敗,因爲它不會真正接收查詢結果,而是延遲查詢呢? – pencilCake

0

除了Thomas的回答,請注意,名稱的「1」部分表示泛型參數的數量。每個泛型參數的類型在括號「[...]」中。

相關問題