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

Gui*_*doG 5 c# winforms visual-studio-2015

我最想念的是这里的内容,
请参见我调试会话的图像。

(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;
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*doG 0

我使用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)
    {
        ;
    }
}
Run Code Online (Sandbox Code Playgroud)

此后,我可以使用该列表ReceivedEmail,而无需检查 MailItem。

  • @WaiHaLee 是的,我不喜欢这个解决方法,但目前这是我所拥有的一切 (2认同)