如果语句由于与另一个IF语句无关的更改而失败

问题描述 投票:0回答:2

当将对电子邮件地址的检查添加到if语句中时,如下所述,if语句if (origin.Equals(true))

bool origin = false;
                    Contact contact = item as Contact;
                    foreach (Item subItem in contactItems)
                    {

                        Contact subcontact = subItem as Contact;

                        if ((contact.DisplayName.Equals(subcontact.DisplayName) || (contact.DisplayName is null && subcontact.DisplayName is null)) && ((contact.CompanyName is null && subcontact.CompanyName is null) || (contact.CompanyName.Equals(subcontact.CompanyName)) && ((contact.EmailAddresses[EmailAddressKey.EmailAddress1] is null && subcontact.EmailAddresses[EmailAddressKey.EmailAddress1] is null) || (contact.EmailAddresses[EmailAddressKey.EmailAddress1].Equals(subcontact.EmailAddresses[EmailAddressKey.EmailAddress1])))))
                        {
                            if (origin.Equals(true))
                            {

                                try
                                {
                                    Console.WriteLine(contact.DisplayName + " " + subcontact.DisplayName);
                                    Console.WriteLine(contact.EmailAddresses[EmailAddressKey.EmailAddress1]);
                                    subcontact.Delete(DeleteMode.HardDelete);

                                }
                                catch
                                {
                                    Console.WriteLine("Cannot delete" + " " + subcontact.DisplayName);

                                }
                            }
                            origin = true;
                        }
                    }

如果我从另一个if语句中删除if (origin.Equals(true))或删除了&& ((contact.EmailAddresses[EmailAddressKey.EmailAddress1] is null && subcontact.EmailAddresses[EmailAddressKey.EmailAddress1] is null) || (contact.EmailAddresses[EmailAddressKey.EmailAddress1].Equals(subcontact.EmailAddresses[EmailAddressKey.EmailAddress1])),则联系人将通过try-catch块。

谁能看到原因吗?

c# exchangewebservices contacts
2个回答
0
投票
if ((contact.DisplayName.Equals(subcontact.DisplayName) || (contact.DisplayName is null && subcontact.DisplayName is null)) && ((contact.CompanyName is null && subcontact.CompanyName is null) || (contact.CompanyName.Equals(subcontact.CompanyName)) && ((contact.EmailAddresses[EmailAddressKey.EmailAddress1] is null && subcontact.EmailAddresses[EmailAddressKey.EmailAddress1] is null) || (contact.EmailAddresses[EmailAddressKey.EmailAddress1].Equals(subcontact.EmailAddresses[EmailAddressKey.EmailAddress1])))))

应该是:

    if ((contact.DisplayName.Equals(subcontact.DisplayName) || (contact.DisplayName is null && subcontact.DisplayName is null) 
&& ((contact.CompanyName is null && subcontact.CompanyName is null) || (contact.CompanyName.Equals(subcontact.CompanyName)) 
&& ((contact.EmailAddresses[EmailAddressKey.EmailAddress1] is null && subcontact.EmailAddresses[EmailAddressKey.EmailAddress1] is null) || (contact.EmailAddresses[EmailAddressKey.EmailAddress1].Equals(subcontact.EmailAddresses[EmailAddressKey.EmailAddress1])))

我所看到的问题是您使用的()数量,我认为这是不正确的。

[尝试清理您的if语句以防止发生此类错误,因为这是很长的时间,并且不需要用括号括起来]

编辑:我尝试运行一些代码,它可以工作。我在上面提到的IF语句示例中确实犯了一些错误。也许尝试复制我的代码,然后将您的特定代码替换为它。它应该以这种方式工作。

    public static void Main()
{
    bool origin = false;

    int[] t = {0,4,6,8,5,6,4,5};

    foreach(int i in t){
         if ((true || (true && true)) // if ((contact.DisplayName.Equals(subcontact.DisplayName) || (contact.DisplayName is null && subcontact.DisplayName is null)) 
            && ((true && true) || (true)) // && ((contact.CompanyName is null && subcontact.CompanyName is null) || (contact.CompanyName.Equals(subcontact.CompanyName))) 
            && ((true && true) || (true))) // && ((contact.EmailAddresses[EmailAddressKey.EmailAddress1] is null && subcontact.EmailAddresses[EmailAddressKey.EmailAddress1] is null) || (contact.EmailAddresses[EmailAddressKey.EmailAddress1].Equals(subcontact.EmailAddresses[EmailAddressKey.EmailAddress1])))))
        {
            if (origin.Equals(true))
            {

                try
                {
                    Console.WriteLine("here");
                }
                catch
                {
                     Console.WriteLine("Cannot delete" );

                }
            }
            origin = true;
        }
    }


}

0
投票

我建议一个小助手:

private bool EqualOrBothNull( string fromContact, string fromSubcontact )
{
    if ( fromContact == null && fromSubcontact == null ) return true;
    if ( fromContact != null && fromContact.Equals(fromSubcontact) ) return true;
    return false;
}

然后您可以像这样使用它:

if ( EqualOrBothNull( contact.DisplayName, subContact.DisplayName ) &&
     EqualOrBothNull( contact.CompanyName, subContact.CompanyName ) &&
     EqualOrBothNull( contact.EmailAddresses[EmailAddressKey.EmailAddress1],
                      subContact.EmailAddresses[EmailAddressKey.EmailAddress1])
    )
{ 
   // ...

}

这将提高可读性,并使查找错误(如果有的话)更加容易。

© www.soinside.com 2019 - 2024. All rights reserved.