2012-07-16 17 views
6

Ho sbattuto la testa contro il muro per 25 minuti cercando di capire perché non riesco ad accedere al "primo" indice di un array, che stavo cercando di fare con l'array [0]. Ho continuato a ottenere un'eccezione per l'indice di array fuori dai limiti. Solo per vedere cosa sarebbe successo, ho provato ad usare array [1] ... e ha funzionato. Perfettamente. Non ho idea del perché.C# Array di componenti aggiuntivi di Outlook iniziano da 1?

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

Il tutto funziona bene. Cosa sta succedendo qui?

+2

Che cosa dice la documentazione? Mi sembra che 'Items' sia un tipo di collection avvolto che sovraccarica' operator [] 'e lancia un' IndexOutOfRangeException' per l'indice 0. Si noti inoltre che gli array VB sono a 1 indice, quindi forse questo è uno shim di compatibilità? (mi sembra strano, ma hey, chi lo sa.) Non puoi dare un'occhiata alla collezione nel debugger? –

+2

Sì, la maggior parte delle raccolte nel modello a oggetti di Office sono a base uno. Sono d'accordo che la documentazione di OOM è scritta in modo terribilmente maleducato. – Douglas

risposta

14

Sembra che il modello a oggetti di Outlook è parte del modello di oggetti Office e come http://msdn.microsoft.com/en-us/library/aa189134%28v=office.10%29.aspx stati,

La maggior parte delle collezioni utilizzati nelle applicazioni di Office (ad eccezione di accesso) sono a base uno, cioè, l'indice numero del primo elemento della collezione è 1.

Inoltre, http://msdn.microsoft.com/en-us/library/522xhsa3%28v=vs.90%29.aspx ci dice specificamente che

Per accedere al fi primo elemento di una raccolta nel modello a oggetti di un'applicazione Microsoft Office, utilizzare l'indice 1 anziché 0.

+0

Affascinante! Nella mia ricerca su questo argomento, ho saltato articoli come il primo a cui ti sei collegato, perché in particolare dice Windows XP in alto, e sto usando Windows 7 (non avevo idea che fosse trasferito!). Il secondo è davvero quello che avrei dovuto cercare, ma anche attraverso le mie ricerche su Google e guardando attraverso vari tutorial di MSDN (e di altri), non ho mai trovato un link o una spiegazione. Grazie mille! – Jake

1

Sì, sembra che Articoli restituisca un collection object, e quelli sono noti per essere vaghi quando si accede con un modificatore di array del genere. Dovresti essere in grado di eseguire .ToArray() per ottenere il comportamento che ti aspetti, altrimenti potresti semplicemente usare foreach var item in items e ottenere tutto nella cartella, con un costrutto che è garantito anche per la terminazione.

+0

Simile a quello che ho detto nel mio commento a MvanGeest, ho saltato articoli come quello a cui ti colleghi, perché menziona specificamente VBA, e sto usando C# .NET, quindi non avevo idea che le cose continuassero così tra le lingue . Il tutto è molto strano per me ... userò sicuramente il metodo .ToArray(), quindi tutto funziona come dovrebbe, grazie! – Jake

Problemi correlati