2012-07-16 7 views
6

Przez 25 minut waliłem głową w ścianę, próbując zrozumieć, dlaczego nie mam dostępu do "pierwszego" indeksu tablicy, który próbowałem zrobić z tablicą [0]. Wciąż otrzymywałem wyjątek Index Out of Bounds. Aby zobaczyć, co się stanie, spróbowałem użyć array [1] ... i zadziałało. Doskonale. Nie mam pojęcia dlaczego.C# Outlook Add-In Arrays Zacznij od 1?

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

Wszystko działa dobrze. Co tu się dzieje?

+2

Co mówi dokumentacja? Brzmi dla mnie jak "Items" to jakiś owinięty typ kolekcji, który przeciąża 'operator []' i rzuca 'IndexOutOfRangeException' dla indeksu 0. Należy również zauważyć, że tablice VB są 1-indeksowane, więc może to jest podkład kompatybilności? (brzmi to dziwnie, ale hej, kto wie.) Nie możesz po prostu zerknąć na kolekcję w debugerze? –

+2

Tak, większość kolekcji w modelu obiektowym Office jest opartych na jednej. Zgadzam się, że dokumentacja OOM jest zatrważająco słabo napisana. – Douglas

Odpowiedz

14

Wydaje się, że Object Model Outlook jest częścią pakietu Office Object Model, jak i http://msdn.microsoft.com/en-us/library/aa189134%28v=office.10%29.aspx państw,

większości kolekcji wykorzystywanych w zastosowaniach biurowego (z wyłączeniem dostępu) są jednym opartych, czyli indeks numer pierwszego elementu w kolekcji jest 1.

również http://msdn.microsoft.com/en-us/library/522xhsa3%28v=vs.90%29.aspx konkretnie mówi nam, że

Aby uzyskać dostęp do Internetu pierwszy element kolekcji w modelu obiektowym aplikacji Microsoft Office, użyj indeksu 1 zamiast 0.

+0

Fascynujące! W swoich badaniach dotyczących tego tematu pominąłem artykuły takie jak ten pierwszy, z którym się łączyłeś, ponieważ wyraźnie mówi się o systemie Windows XP i używam Windows 7 (nie miałem pojęcia, że ​​to przeniesiono!). Drugi jest naprawdę tym, czego powinienem był szukać, ale nawet przez moje wyszukiwania w Google i przeglądanie różnych samouczków MSDN (i innych), nigdy nie znalazłem linku ani wyjaśnienia. Dzięki wielkie! – Jake

1

Tak, wygląda na to, że Produkty zwracają wartość collection object, a te, o których wiadomo, że są niedokładne, są dostępne przy użyciu takiego modyfikatora macierzy. Powinieneś być w stanie zrobić .ToArray(), aby uzyskać oczekiwane zachowanie, w przeciwnym razie możesz po prostu użyć foreach var item in items i uzyskać wszystko w folderze, z konstrukcją, która jest gwarantowana do zakończenia.

+0

Podobnie do tego, co powiedziałem w swoim komentarzu do MvanGeest, pominąłem artykuły takie jak ten, z którym się łączyłeś, ponieważ wspomniałeś o VBA i korzystam z C# .NET, więc nie miałem pojęcia, że ​​sprawy zachodzą między tymi językami . Cała sprawa jest dla mnie bardzo dziwna ... Zdecydowanie używam metody .ToArray(), więc wszystko działa tak, jak powinno, dzięki! – Jake

Powiązane problemy