c # понимание выражения bool - PullRequest
2 голосов
/ 23 июня 2011

Это действительно простой вопрос, я уверен, но я не могу понять, почему это утверждение не выполняется ...

в основном, если IsApple имеет значение false или IsBannana является ложным, утверждение должно сработать, однако, если один из двухистинное утверждение должно пройти, кто-нибудь может объяснить, почему это утверждение не удается?

        [Test]
        public void IsApplesOrBannans()
        {
            bool IsApple = true;
            bool IsBannana = false;

            if (!IsApple || !IsBannana)
                Assert.Fail();

            Assert.Pass();
        }

Ответы [ 9 ]

5 голосов
/ 23 июня 2011

То, что вы говорите, не имеет смысла.

Вот как я (и компилятор) понимаю, что вы говорите:

в основном, если IsApple имеет значение false или IsBannana является ложным, утверждение должно завершиться ошибкой

  • Если IsApple имеет значение false, утверждение не будет выполнено
  • Если IsBanana имеет значение false, утверждение не будет выполнено

Другими словами, если один из них ложный, вам все равно , является ли другой ложным.

однако, если одно из двух истинно, утверждение должно пройти

  • Если один из них истинен, вам не важно , является ли другой тоже правдой.

Эти требования противоречат друг другу.

Возможно, вы имели в виду "если IsApple ложно И IsBanana ложно"; то есть, если они оба ложные.

Но то, что вы написали, было "если IsApple ложно ИЛИ IsBanana ложно", то есть, если один из них ложно.

4 голосов
/ 23 июня 2011

!IsBannana имеет значение true, поэтому значение if равно true.

Бьюсь об заклад, вы хотели:

if(!IsApple && !IsBananna)
    Assert.Fail();
4 голосов
/ 23 июня 2011

Утверждение потерпит неудачу, если ЛИБО ЛОЖНО, оно пройдет, только если ОБА верны.

Редактировать: Я бы переписал это как:

if (IsApple || IsBanana)
{
    Assert.Pass();
}
else
{
    Assert.Fail();
}

Интересно, вопросна поставленное не может быть ответа (поскольку, если один является истинным, а другой ложным в соответствии с вопросом, ожидаемый результат неоднозначен).

1 голос
/ 23 июня 2011

Сделайте это вместо:

if(!IsApple && !IsBannana)
0 голосов
/ 23 июня 2011

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

   [Test]      
    public void IsApplesOrBannans() 
    {      
       bool IsApple = true;     
       bool IsBannana = false;    
       if (!(IsApple || IsBannana))   
            Assert.Fail();        
       Assert.Pass();       
    }
0 голосов
/ 23 июня 2011
        if (IsApple != IsBannana)
            Assert.Fail();

Я думаю, что этот трюк != - это часто задаваемые вопросы по C #, поскольку XOR * для бедняка

0 голосов
/ 23 июня 2011
(!A|| !A) = !!(!A || !B) = !(A && B) = !(true && false) --> false
0 голосов
/ 23 июня 2011

Ваше условие прохождения противоречит вашему условию сбоя, потому что, если только одно верно, другое ложно и, следовательно, удовлетворяет условию сбоя.

, если вы хотите, чтобы это имело смысл, измените его на:

if (!IsApple && !IsBanana)
    Assert.Fail():

или, если вы также не хотите, чтобы это были яблоки и бананы одновременно

if (IsApple == IsBanana)
    Assert.Fail():
0 голосов
/ 23 июня 2011

Ваше условие прохождения: IsApple || IsBannana, поэтому ваше условие сбоя можно записать в виде:

if (!(IsApple || IsBannana))

Или, в качестве альтернативы, вы можете сказать, что оба должны быть ложными, чтобы не работать:

if ((IsApple==false) && (IsBannana==false))

Который обычно пишется как:

if (!IsApple && !IsBannana))

Лично я считаю, что первый из этих трех вариантов является лучшим.Но это просто стилистический выбор.функционально они эквивалентны.

Или, что еще лучше, вы можете переключить then и else часть if:

public void IsApplesOrBannans()
{
    bool IsApple = true;
    bool IsBannana = false;

    if (IsApple || IsBannana)
        Assert.Pass();
    else
        Assert.Fail();            
}

или даже выбросить ifЗаявление целиком:

public void IsApplesOrBannans()
{
    bool IsApple = true;
    bool IsBannana = false;

    Assert.IsTrue(IsApple || IsBannana);
}
...