2012-07-16 6 views
6

Kafamı 25 dakika boyunca duvarımın karşısına vurdum ve dizinin 'ilk' dizinine neden erişemediğimi anlamaya çalışıyorum. Sınır Dışı Durum Dışı Durum Dışı Durumunu almaya devam ettim. Sadece ne olacağını görmek için dizi [1] kullanmayı denedim ... ve işe yaradı. Kusursuzca. Neden olduğuna dair hiçbir fikrim yok.C# Outlook Eklenti Dizileri 1'den başlıyor musunuz?

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

Her şey iyi çalışıyor. Burada neler oluyor?

+2

Dokümantasyon ne diyor? 'Öğeler' gibi bana 'sesler' operatörü [] 'aşırı yüklenir ve indeks 0 için bir 'IndexOutOfRangeException' atar bazı sarılmış toplama türü olduğunu da VB dizileri 1-endeksli olduğunu unutmayın, belki de bu bir uyumluluk shim nedir? (Bana garip geliyor, ama kim bilir.) Sadece debugger'daki koleksiyona bakamaz mısın? –

+2

Evet, Office Nesne Modeli'ndeki koleksiyonların çoğu tek tabanlı. OOM belgelerinin kötü bir şekilde yazılı olduğunu kabul ediyorum. – Douglas

cevap

14

O Outlook nesne modeli Ofisi Nesne Modeli parçasıdır ve http://msdn.microsoft.com/en-us/library/aa189134%28v=office.10%29.aspx devletler,

(Erişim hariç) Office uygulamalarında kullanılan çoğu koleksiyonlarından

tek temel aldığından, yani endeks görünür koleksiyondaki ilk öğe sayısı da 1.

olduğunu http://msdn.microsoft.com/en-us/library/522xhsa3%28v=vs.90%29.aspx özellikle

fi erişmek için söyler Microsoft Office uygulamasının nesne modelindeki bir koleksiyonun ilk öğesi, 0 yerine dizin 1'i kullanın.

+0

Büyüleyici! Bu konudaki araştırmamda, ilk bağlandığınız gibi makaleleri atladım, çünkü özellikle Windows XP üstte diyor ve Windows 7'yi kullanıyorum (taşıdığı hakkında hiçbir fikrim yoktu!). İkincisi gerçekten aradığım şeydi, ancak Google aramalarımda ve çeşitli MSDN (ve diğerlerinin) eğitimlerini incelerken bile, hiçbir zaman bir bağlantı veya açıklama bulamadım. Çok teşekkürler! – Jake

1

Evet, Öğeler bir collection object döndürüyor gibi görünüyor ve bu gibi bir dizi değiştirici ile erişilince bunların vidalı olduğu biliniyor. Beklediğiniz davranışı almak için .ToArray() yapabilmeniz gerekir, aksi halde foreach var item in items'u kullanabilir ve her şeyi klasörde sonlandırabilirsiniz.

+0

MvanGeest'e yaptığım yorumda da söylediğim gibi, bağlantı kurduğunuz gibi makaleleri atladım, çünkü özellikle VBA'dan bahsediyor ve C# .NET kullanıyorum, bu yüzden dillerin bu gibi şeyler üzerinde ilerlemesini hiçbir fikrim yoktu. . Her şey bana çok garip geliyor ... Kesinlikle .ToArray() yöntemini kullanacağım her şey gerektiği gibi çalışır, teşekkürler! – Jake