2012-07-16 79 views
6

我一直在撞牆25分鐘,試圖弄清楚爲什麼我不能訪問數組的'第一'索引,我試圖用數組[0]來處理數組的第一個索引。我不斷收到一個數組索引超出界限例外。爲了看看會發生什麼,我嘗試使用array [1] ...並且它工作。完美。我不知道爲什麼。C#Outlook插件數組從1開始?

for (int i = 1; i < itemCounter+1; i++) 
{ 
    if (explorer.CurrentFolder.Items[i] is Outlook.MailItem) 
    { //Do something } 
} 

整件事情正常。這裏發生了什麼?

+2

該文檔說的是什麼?聽起來像'Items'是一些包裝的集合類型,它重載'operator []'併爲索引0拋出'IndexOutOfRangeException'。另外請注意,VB數組是1索引的,所以也許這是一個兼容性shim? (對我來說聽起來很奇怪,但是,嘿,誰知道。)難道你不能在調試器中窺視集合嗎? – 2012-07-16 20:23:44

+2

是的,Office對象模型中的大多數集合都是基於一個的。我同意OOM文檔寫得很糟糕。 – Douglas 2012-07-16 20:28:20

回答

14

看來,Outlook對象模型是Office對象模型的一部分,併爲http://msdn.microsoft.com/en-us/library/aa189134%28v=office.10%29.aspx狀態,

在Office應用程序(除了接入)使用的大多數藏品都是基於一個,那就是,在指數集合中的第一個項目的數量爲1

此外,http://msdn.microsoft.com/en-us/library/522xhsa3%28v=vs.90%29.aspx明確告訴我們,

要訪問網絡在Microsoft Office應用程序的對象模型中收集的第一項,使用索引1而不是0.

+0

迷人!在我對這個主題的研究中,我跳過了像第一個鏈接到的文章,因爲它特別指出Windows XP在頂部,而我正在使用Windows 7(我不知道它繼承了!)。第二個是我應該一直在尋找的東西,但即使通過我的Google搜索並查看各種MSDN(和其他人)的教程,我也從未找到鏈接或解釋。非常感謝! – Jake 2012-07-16 20:33:29

1

是的,它看起來像項返回一個collection object,這些被稱爲是棘手的,當用這樣的數組修改器訪問。您應該可以執行.ToArray()以獲得您期望的行爲,否則您可以簡單地使用foreach var item in items並獲取文件夾中的所有內容,同時也保證終止構造。

+0

與我在MvanGeest評論中所說的內容類似,我跳過了與鏈接的文章類似的文章,因爲它特別提到了VBA,而且我使用的是C#.NET,因此我不知道語言之間的差異。整個事情對我來說很奇怪......我一定會使用.ToArray()方法,所以一切都按照它應該的方式工作,謝謝! – Jake 2012-07-16 20:35:04