繁体   English   中英

为什么IS运算符在false时输入IF语句?

[英]why does the IS operator enters an IF statement when false?

我最遗憾的是,
请参阅我的调试会话中的图像。

(items[i] is MailItem)根据调试器是FALSE,但它仍然进入if语句。
我在这里错过了什么?

在此输入图像描述

作为参考,这是该方法的完整代码

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;
}

这个 SO答案解释了一下为什么即使内部的表达式为false你看到IF条件被传递的原因。 显然这是调试器和多线程的问题。 此外,它建议通过使用lock来防止此问题的解决方法。 希望能帮助到你。

我使用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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM