請原諒我,如果這是重複的,但這對我來說是一個小問題,我只能花很長時間在我的好奇心上。爲什麼當我在一個foreach塊中使用隱式類型循環變量時,我沒有得到任何Intellisense?推斷的類型似乎很明顯。爲什麼C#中的'foreach'語句中沒有'var'變量的智能感知?
我正在使用ReSharper,但是當我將智能感知切換到VS時,我得到了相同的行爲,這並不認爲這是責任。
編輯:對不起,稍後,但我正在迭代DataTable.Rows,它使用一個無類型的ieterator,如馬克下面解釋。
請原諒我,如果這是重複的,但這對我來說是一個小問題,我只能花很長時間在我的好奇心上。爲什麼當我在一個foreach塊中使用隱式類型循環變量時,我沒有得到任何Intellisense?推斷的類型似乎很明顯。爲什麼C#中的'foreach'語句中沒有'var'變量的智能感知?
我正在使用ReSharper,但是當我將智能感知切換到VS時,我得到了相同的行爲,這並不認爲這是責任。
編輯:對不起,稍後,但我正在迭代DataTable.Rows,它使用一個無類型的ieterator,如馬克下面解釋。
我懷疑你列舉的數據不類型 - 例如的寫在1.1事情很多只實現IEnumerable
,不具有自定義迭代器(你實際上並不需要IEnumerable<T>
做類型迭代 - 事實上你甚至不需要使用IEnumerable
來使用foreach
;很多1.1類型寫了特殊的枚舉類型以避免裝箱/投射等 - 很多工作)。在很多情況下,修復它們將是一個突破性的改變。
一個簡單的例子這裏是PropertyDescriptorCollection
:
var props = TypeDescriptor.GetProperties(obj);
foreach(PropertyDescriptor prop in props) {...} // fine
但實際上,PropertDescriptorCollection
的枚舉只是IEnumerator
,所以Current
是object
- ,因此您總能獲得object
當您使用var
:
var props = TypeDescriptor.GetProperties(obj);
foreach(var prop in props) {...} // prop is "object"
與此對比(等於1.1)StringCollection
;這有一個自定義的枚舉器(StringEnumerator
);所以如果你使用foreach
和var
,你會得到string
(不是object
)。
在任何2.0及以上,這將是有理由期待更好的打字,有兩個原因:
但即使如此,仍然有這樣的情況,當你沒有得到你期望的類型;您可以(也可以更清楚地)手動指定類型,或使用Cast<T>()
/OfType<T>()
。
這發生在我身上很多。鑄
@Stuart B - 確實; 「手動指定類型」也涉及較少的間接性,因此*邊際*更快更清晰。 – 2009-11-08 22:20:22
發佈代碼,它通常適用於我。 – Lazarus 2009-11-08 09:49:36
使用VS,它可以在我的機器上工作......無論如何,這是一個編程問題? – Joren 2009-11-08 09:54:28
我的懷疑是這個集合是Object類型的,這會給Intellisense的數量最少......除此之外,var總是適用於我的foreach – 2009-11-08 09:58:06