c#了解布尔表达式

| 我敢肯定,这是一个非常简单的问题,但是我无法弄清楚为什么这个断言失败了... 基本上,如果IsApple为假或IsBannana为假,则断言应该失败,但是如果两者之一是正确的断言应该通过,那么有人可以解释为什么该断言失败吗?
        [Test]
        public void IsApplesOrBannans()
        {
            bool IsApple = true;
            bool IsBannana = false;

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

            Assert.Pass();
        }
    
已邀请:
        您所说的毫无意义。 这是我(和编译器)如何理解您的意思:   基本上,如果IsApple为假或IsBannana为假,则断言应该失败 如果IsApple为假,则断言将失败 如果IsBanana为假,则断言应该失败 换句话说,如果其中之一为假,则不必理会另一个也为假。   但是,如果两者之一是正确的,则断言应该通过 如果其中一个是正确的,则不必关心另一个是否也是正确的。 这些要求彼此矛盾。 也许您的意思是“如果IsApple是假的而IsBanana是假的”。也就是说,如果它们都是假的。 但是您写的是“如果IsApple为假或IsBanana为假”,也就是说,如果其中之一为假。     
        
!IsBannana
为true,因此if的值为true。 我敢打赌你想要:
if(!IsApple && !IsBananna)
    Assert.Fail();
    
        如果EITHER为假,则断言将失败,只有两个都为真时,断言才会通过。 编辑:我将其重写为:
if (IsApple || IsBanana)
{
    Assert.Pass();
}
else
{
    Assert.Fail();
}
有趣的是,所提出的问题无法回答(因为根据该问题,如果一个为真而另一个为假,则预期结果是不确定的)。     
        而是这样做:
if(!IsApple && !IsBannana)
    
        
        if (IsApple != IsBannana)
            Assert.Fail();
我认为这个技巧“ 6”是C#常见问题解答,作为穷人的XOR     
        您不希望a和b都不为假,或者至少一个应为真的情况,所以
   [Test]      
    public void IsApplesOrBannans() 
    {      
       bool IsApple = true;     
       bool IsBannana = false;    
       if (!(IsApple || IsBannana))   
            Assert.Fail();        
       Assert.Pass();       
    }
    
        您的通过条件为
IsApple || IsBannana
,因此失败条件可以写为:
if (!(IsApple || IsBannana))
或者,您也可以说两者都必须为false才能失败:
if ((IsApple==false) && (IsBannana==false))
通常写为:
if (!IsApple && !IsBannana))
我个人认为这三个选择中的第一个是最好的。但这只是一个风格选择。在功能上,它们是等效的。 甚至更好的是,您可以将
if
then
else
部分切换:
public void IsApplesOrBannans()
{
    bool IsApple = true;
    bool IsBannana = false;

    if (IsApple || IsBannana)
        Assert.Pass();
    else
        Assert.Fail();            
}
甚至完全抛弃ѭ14声明:
public void IsApplesOrBannans()
{
    bool IsApple = true;
    bool IsBannana = false;

    Assert.IsTrue(IsApple || IsBannana);
}
    
        您的通过条件与您的失败条件相矛盾,因为如果只有一个为真,则另一个为假,从而满足了失败条件。 如果您希望它有意义,请将其更改为:
if (!IsApple && !IsBanana)
    Assert.Fail():
或者,如果您也不想同时使用它作为苹果和香蕉
if (IsApple == IsBanana)
    Assert.Fail():
    
        
(!A|| !A) = !!(!A || !B) = !(A && B) = !(true && false) --> false
    

要回复问题请先登录注册