IS操作员为何在输入false时输入IF语句?

时间:2019-05-03 06:14:16

标签: c# winforms visual-studio-2015

我最想念的是这里,
请参阅我在调试会话中创建的图像。

(items[i] is MailItem)根据调试器为FALSE,但仍会输入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 个答案:

答案 0 :(得分:1)

This这样的回答解释了为什么即使看到IF里面的false条件也被传递的原因。显然,这是调试器和多个线程的问题。此外,它还建议使用lock来防止此问题的解决方法。希望对您有所帮助。

答案 1 :(得分:0)

我使用了Wai Ha Lee提供的the link来解决。但是我不得不更改它,因为测试项目是否为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。