我确信这是一个非常简单的问题,但我无法弄清楚为什么这个断言失败了......
基本上如果IsApple是假的或者IsBannana是假的断言应该失败,但是如果其中一个是真的断言应该通过,那么有人可以解释为什么这个断言失败了吗?
[Test]
public void IsApplesOrBannans()
{
bool IsApple = true;
bool IsBannana = false;
if (!IsApple || !IsBannana)
Assert.Fail();
Assert.Pass();
}
答案 0 :(得分:5)
你所说的毫无意义。
以下是我(和编译器)理解你所说的内容:
基本上如果IsApple为false或IsBannana为false,则断言失败
换句话说,如果其中一个是假的,你不关心另一个是否也是假的。
但是如果其中一个是真的断言应该通过
这些要求相互矛盾。
也许你的意思是“如果IsApple是假的 AND IsBanana是假的”;也就是说,如果它们都为假。
但你写的是“如果IsApple是假的 OR IsBanana是假的”,也就是说,如果其中一个是假的。
答案 1 :(得分:4)
如果EITHER为false,则断言将失败,只有在BOTH为真时才会通过。
编辑:我会将其重写为:
if (IsApple || IsBanana)
{
Assert.Pass();
}
else
{
Assert.Fail();
}
有趣的是,提出的问题无法回答(因为如果一个是真的而另一个是假的,那么预期的结果是不明确的。)
答案 2 :(得分:4)
!IsBannana
为真,因此if计算结果为真。
我打赌你想要:
if(!IsApple && !IsBananna)
Assert.Fail();
答案 3 :(得分:1)
请改为:
if(!IsApple && !IsBannana)
答案 4 :(得分:0)
您的通过条件为IsApple || IsBannana
,因此您的失败条件可写为:
if (!(IsApple || IsBannana))
或者你可以说两者都必须是假的失败:
if ((IsApple==false) && (IsBannana==false))
通常写成:
if (!IsApple && !IsBannana))
我个人认为这三种选择中的第一种是最好的。但这只是一种风格选择。在功能上它们是等价的。
甚至更好,您可以切换then
的{{1}}和else
部分:
if
甚至完全抛弃public void IsApplesOrBannans()
{
bool IsApple = true;
bool IsBannana = false;
if (IsApple || IsBannana)
Assert.Pass();
else
Assert.Fail();
}
声明:
if
答案 5 :(得分:0)
你的通过条件与你的失败条件相矛盾,因为如果只有一个是真的,那么另一个是假的,从而满足失败条件。
如果您希望它有意义,请将其更改为:
if (!IsApple && !IsBanana)
Assert.Fail():
或者,如果您也不希望它同时成为苹果和香蕉
if (IsApple == IsBanana)
Assert.Fail():
答案 6 :(得分:0)
(!A|| !A) = !!(!A || !B) = !(A && B) = !(true && false) --> false
答案 7 :(得分:0)
if (IsApple != IsBannana)
Assert.Fail();
我认为这个技巧!=
是一个C#FAQ,因为穷人的XOR
答案 8 :(得分:0)
你不希望a和b都不是假的情况,或者至少有一个应该是真的,所以
[Test]
public void IsApplesOrBannans()
{
bool IsApple = true;
bool IsBannana = false;
if (!(IsApple || IsBannana))
Assert.Fail();
Assert.Pass();
}