почему оператор IS вводит оператор IF, когда ложь? - PullRequest
5 голосов
/ 03 мая 2019

Мне больше всего не хватает чего-то здесь,
см. Изображение, которое я сделал из моей сессии отладки.

(items[i] is MailItem) - это ЛОЖЬ в соответствии с отладчиком, но все равно он входит в оператор if.
Что мне здесь не хватает?
.

enter image description here

Для справки приведен полный код этого метода

private MailItem GetMailBySubject(DateTime dateReceived, string subject)
{
    MailItem Result = null;

    Microsoft.Office.Interop.Outlook.Application OutlookIns = new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.NameSpace olNamespace = OutlookIns.GetNamespace("MAPI");
    MAPIFolder myInbox = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);


    Items items = myInbox.Items;
    int count = items.Count;
    MailItem mail = null;
    int i = 1; //DO NOT START ON 0

    while ((i < count) && (Result == null))
    {
        if (items[i] is MailItem)
        {
            mail = (MailItem)items[i];
            if ((mail.ReceivedTime.ToString("yyyyMMdd hh:mm:ss") == dateReceived.ToString("yyyyMMdd hh:mm:ss")) && (mail.Subject == subject))
            {
                Result = mail;
            }
        }
        i++;
    }

    return Result;
}

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Этот ответ SO немного объясняет, почему вы видите, что условие IF проходит, даже когда выражение внутри него равно false.Очевидно, это проблема с отладчиком и несколькими потоками.Кроме того, он предлагает обходной путь для предотвращения этой проблемы с помощью lock.Надеюсь, это поможет.

0 голосов
/ 03 мая 2019

Я сделал обходной путь, используя ссылку , предоставленную Wai Ha Lee. Я должен был изменить это, хотя, потому что тестирование, если элемент MailItem все еще вел себя странно.

Поэтому я сначала копирую элементы в отдельный список и проверяю, чтобы в этом списке были только элементы типа MailItem.
Единственный способ получить этот фильтр - использовать try...catch, мне все равно хотелось бы лучшего способа, и мне все еще любопытно, почему тест if (items[i] is MailItem) ведет себя так странно.

List<MailItem> ReceivedEmail = new List<MailItem>();
foreach (var testMail in items)
{
    try
    {
        ReceivedEmail.Add((MailItem)testMail);
    }
    catch (System.Exception ex)
    {
        ;
    }
}

После этого я могу использовать список ReceivedEmail без проверки на MailItem.

...