2012-07-16 8 views
6

He estado golpeando mi cabeza contra la pared durante 25 minutos tratando de averiguar por qué no puedo acceder al 'primer' índice de una matriz, que estaba tratando de hacer con la matriz [0]. Seguí obteniendo un Array Index Out of Bounds Exception. Solo para ver qué pasaría, traté de usar array [1] ... y funcionó. Perfectamente. No tengo ni idea de porqué.C# Arreglos de complementos de Outlook ¿Comenzar en 1?

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

Todo funciona bien. ¿Que está pasando aqui?

+2

¿Qué dice la documentación? Me parece que 'Items' es algún tipo de colección envolvente que sobrecarga 'operator []' y arroja un 'IndexOutOfRangeException' para el índice 0. También tenga en cuenta que las matrices VB tienen un índice, ¿entonces quizás se trata de una compatibilidad de calce? (Suena raro para mí, pero bueno, quién sabe). ¿No puedes echar un vistazo a la colección en el depurador? –

+2

Sí, la mayoría de las colecciones en el Modelo de objetos de Office se basan en una sola. Estoy de acuerdo con que la documentación de OOM está terriblemente mal escrita. – Douglas

Respuesta

14

Parece que el modelo de objetos de Outlook es parte del modelo de objetos de oficina, y como http://msdn.microsoft.com/en-us/library/aa189134%28v=office.10%29.aspx estados,

mayoría de las colecciones se utilizan en aplicaciones de oficina (excepto el acceso) se basa en uno, es decir, el índice número del primer elemento de la colección es 1.

Además, http://msdn.microsoft.com/en-us/library/522xhsa3%28v=vs.90%29.aspx nos dice específicamente que

Para acceder a la fi primer elemento de una colección en el modelo de objetos de una aplicación de Microsoft Office, use el índice 1 en lugar de 0.

+0

¡Fascinante! En mi investigación sobre este tema, me salteé artículos como el primero al que se vinculó, porque dice específicamente que Windows XP está en la parte superior, y estoy usando Windows 7 (¡no tenía idea de que se hubiera prolongado!). El segundo es realmente lo que debería haber estado buscando, pero incluso a través de mis búsquedas en Google y mirando a través de varios tutoriales de MSDN (y de otros), nunca encontré un enlace o una explicación. ¡Muchas gracias! – Jake

1

Sí, parece que Items devuelve un collection object, y se sabe que estos son molestos cuando se accede con un modificador de matriz como ese. Debería poder hacer .ToArray() para obtener el comportamiento que espera, de lo contrario, simplemente podría usar foreach var item in items y obtener todo en la carpeta, con una construcción que también se garantiza que terminará.

+0

Similar a lo que dije en mi comentario a MvanGeest, omití artículos como el que enlazaba, porque menciona específicamente a VBA, y estoy usando C# .NET, así que no tenía idea de que las cosas se llevaran así entre los idiomas . Todo esto es muy extraño para mí ... Definitivamente voy a usar el método .ToArray() para que todo funcione como debería, ¡gracias! – Jake