Некорректная работа цикла For Each на разных ПК

ACXap

Здравствуйте. Столкнулся небольшой проблемой как некорректная работа цикла For Each на 2 из 5 компьютерах на которых проверялось
Компы
  1. Комп на котором все писалось: Win7 - 32b, Visual Studio 2015, Net 4.6 - Работает и та и та конструкция
  2. Комп Win7 - 64b, Net 4.5 - работает и та и та конструкция
  3. Комп Win7 - 64b, Net 4.0 - не работает с явным указанием типа
  4. Комп Win7 - 64b, Net 4.0 - не работает с явным указанием типа
  5. Комп дома Win7 - 64b, Net 4.6 - Работает и та и та конструкция
Если переменной цикла явно указываю тип данных, то цикл "не видит" всех свойств объекта (извините за возможной некорректную формулировку) Явно говорю что переменная оутлуковское вложение то при выводи информации о вложении, размер самого вложения указывается как нулевое и при этом не выдает никаких ошибок, если переменной ничего не говорю, то выводится все нормально. Вот такая конструкция некорректно работает:
For Each MyItem As Object In a.Items
            For Each myItemAtt As Outlook.Attachment In MyItem.Attachments
                TextBox1.Text &= MyItem.size & " " & myItemAtt.FileName & " " & myItemAtt.Size & vbCrLf
            Next
        Next
Вот такая конструкция работает:
For Each MyItem In a.Items
            For Each myItemAtt In MyItem.Attachments
                TextBox2.Text &= MyItem.size & " " & myItemAtt.FileName & " " & myItemAtt.Size & vbCrLf
            Next
        Next
Код в свойствах стоит платформа .Net 3.5
Imports Microsoft.Office.Interop
 
Public Class Form1
    Public oOutlook As New Outlook.Application
    Public oNameSpace As Outlook.NameSpace = oOutlook.GetNamespace("MAPI")
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox1.Text = ""
        Dim a As Outlook.Folder = oNameSpace.PickFolder
        For Each MyItem As Object In a.Items
            For Each myItemAtt As Outlook.Attachment In MyItem.Attachments
                TextBox1.Text &= MyItem.size & " " & myItemAtt.FileName & " " & myItemAtt.Size & vbCrLf
            Next
        Next
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        TextBox2.Text = ""
        Dim a As Outlook.Folder = oNameSpace.PickFolder
        For Each MyItem In a.Items
            For Each myItemAtt In MyItem.Attachments
                TextBox2.Text &= MyItem.size & " " & myItemAtt.FileName & " " & myItemAtt.Size & vbCrLf
            Next
        Next
    End Sub
End Class
Как он некорректно выполняется на 2 компьютерах
2 ответа

ACXap

Нужно в дебаггере посмотреть типы. которые реально хранятся в коллекции Items и что происходит, когда Item приводится к типу Object


ACXap

в коллекции Items
В том то и дело, что в этой коллекции могу быть разные типы (MailItem, ReportItem). Но я проверил еще два варианта: Работает на всех компах, объявил только тип для элементов коллекции items:
For Each MyItem As Object In a.Items
            For Each myItemAtt In MyItem.Attachments
.....
Не работает на тех двух, объявил только тип для вложения:
For Each MyItem In a.Items
            For Each myItemAtt As Outlook.Attachment In MyItem.Attachments
....
А дальше от отчаяния решил переписать на NET 2.0, 4.0 и 4.5. На тех компах, на которых и так работало - продолжило работать, на тех, где не работало, ничего не изменилось (4.5 соответственно вообще не запустилась). Но тут поставил NET 4.5 и все заработало, но опять же только с проектом написанным на 4.5. Вопрос о установки 4.5 к сожалению не поднимается (это на 250 компьютеров надо будет ставить), а остается вопрос на что и как влияет явное указание типа переменной для циклов типа For Each ? Или же это не критично и не указывать тип и продолжить дальше тестирование остального проекта?