C# Outlook 加载项中的数组是否从1开始?

7

我已经花了25分钟的时间,一直试图弄清楚为什么我无法访问数组的“第一个”索引,我尝试使用array[0]进行访问。但是我一直收到Array Index Out of Bounds Exception的错误提示。只是为了看看会发生什么,我尝试使用array[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开始索引的,所以也许这是一个兼容性的垫片?(听起来有点奇怪,但是谁知道呢。)你不能在调试器中查看集合吗? - Ed S.
2
是的,Office对象模型中的大多数集合都是基于1的。我同意OOM文档写得非常糟糕。 - Douglas
2个回答

17

看起来,Outlook对象模型是Office对象模型的一部分。根据http://msdn.microsoft.com/en-us/library/aa189134%28v=office.10%29.aspx所述:

除了Access之外,在Office应用程序中使用的大多数集合都是基于1的,也就是说,集合中第一个项目的索引号为1。

此外,http://msdn.microsoft.com/en-us/library/522xhsa3%28v=vs.90%29.aspx特别告诉我们:

要访问Microsoft Office应用程序对象模型中集合的第一个项,请使用索引1而不是0。


太有趣了!在我的研究中,我跳过了第一篇你提供的文章,因为它顶部明确写着Windows XP,而我用的是Windows 7(我不知道它是否适用于Windows 7!)。第二篇才是我真正应该寻找的,但即使通过谷歌搜索和查看各种MSDN(和其他)教程,我也没有找到一个链接或解释。非常感谢! - Jake

1

是的,看起来Items返回一个集合对象,当使用类似于数组修改器的方式访问时,这些对象会变得混乱。你应该能够使用.ToArray()来获得你期望的行为,否则你可以简单地使用foreach var item in items获取文件夹中的所有内容,并且这个结构也保证了终止。


就像我在回复MvanGeest的评论中所说的那样,我跳过了像你链接的那篇文章这样的文章,因为它特别提到了VBA,而我正在使用C# .NET,所以我不知道这些东西是否适用于不同的编程语言。整个事情对我来说非常奇怪...我一定会使用.ToArray()方法,这样一切都能正常工作,谢谢! - Jake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接