2012-07-16 83 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