Если утверждение не выполнено из-за несвязанного изменения другого оператора IF - PullRequest
0 голосов
/ 24 апреля 2020

Когда проверка по адресу электронной почты добавляется в оператор 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 (origin.Equals(true)) или удаляю && ((contact.EmailAddresses[EmailAddressKey.EmailAddress1] is null && subcontact.EmailAddresses[EmailAddressKey.EmailAddress1] is null) || (contact.EmailAddresses[EmailAddressKey.EmailAddress1].Equals(subcontact.EmailAddresses[EmailAddressKey.EmailAddress1])) из другой оператор if, контакт проходит через блок try-catch.

Кто-нибудь может понять почему?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2020

Я предлагаю небольшой помощник:

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])
    )
{ 
   // ...

}

Это увеличивает читабельность и облегчит поиск ошибки, если таковая имеется.

0 голосов
/ 24 апреля 2020

Спасибо за все возможные ответы, к сожалению, они не устранили проблему, хотя код гораздо легче читать! В конце я отделил проверку адреса электронной почты от другого оператора IF, который, кажется, работает

0 голосов
/ 24 апреля 2020
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, чтобы предотвратить появление ошибок такого типа, поскольку эта ошибка была довольно длинной, и некоторые из ваших скобок не нужны

EDIT : я попытался запустить некоторый код, и он работает , Я допустил некоторые ошибки в образце оператора IF, о котором я упоминал выше. Возможно, попробуйте скопировать мой код и подставить в него указанный вами c код. Это должно работать таким образом.

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


}
...