2009-11-08 43 views
3

請原諒我,如果這是重複的,但這對我來說是一個小問題,我只能花很長時間在我的好奇心上。爲什麼當我在一個foreach塊中使用隱式類型循環變量時,我沒有得到任何Intellisense?推斷的類型似乎很明顯。爲什麼C#中的'foreach'語句中沒有'var'變量的智能感知?

我正在使用ReSharper,但是當我將智能感知切換到VS時,我得到了相同的行爲,這並不認爲這是責任。

編輯:對不起,稍後,但我正在迭代DataTable.Rows,它使用一個無類型的ieterator,如馬克下面解釋。

+5

發佈代碼,它通常適用於我。 – Lazarus 2009-11-08 09:49:36

+0

使用VS,它可以在我的機器上工作......無論如何,這是一個編程問題? – Joren 2009-11-08 09:54:28

+5

我的懷疑是這個集合是Object類型的,這會給Intellisense的數量最少......除此之外,var總是適用於我的foreach – 2009-11-08 09:58:06

回答

7

我懷疑你列舉的數據不類型 - 例如的寫在1.1事情很多只實現IEnumerable,不具有自定義迭代器(你實際上並不需要IEnumerable<T>做類型迭代 - 事實上你甚至不需要使用IEnumerable來使用foreach;很多1.1類型寫了特殊的枚舉類型以避免裝箱/投射等 - 很多工作)。在很多情況下,修復它們將是一個突破性的改變。

一個簡單的例子這裏是PropertyDescriptorCollection

var props = TypeDescriptor.GetProperties(obj); 
foreach(PropertyDescriptor prop in props) {...} // fine 

但實際上,PropertDescriptorCollection的枚舉只是IEnumerator,所以Currentobject - ,因此您總能獲得object當您使用var

var props = TypeDescriptor.GetProperties(obj); 
foreach(var prop in props) {...} // prop is "object" 

與此對比(等於1.1)StringCollection;這有一個自定義的枚舉器(StringEnumerator);所以如果你使用foreachvar,你會得到string(不是object)。

在任何2.0及以上,這將是有理由期待更好的打字,有兩個原因:

  • 仿製藥(用於簡單的情況下),從而能夠寫出強類型集合理智
  • 迭代器塊(用於非平凡的情況),使得有可能編寫自定義迭代器而不會發瘋

但即使如此,仍然有這樣的情況,當你沒有得到你期望的類型;您可以(也可以更清楚地)手動指定類型,或使用Cast<T>()/OfType<T>()

+0

這發生在我身上很多。鑄()的作品,但我發現它更清楚,只是不使用VAR在這種情況下。 – 2009-11-08 21:14:23

+0

@Stuart B - 確實; 「手動指定類型」也涉及較少的間接性,因此*邊際*更快更清晰。 – 2009-11-08 22:20:22

相關問題