[英]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.