短路情况失败

时间:2016-09-15 16:56:13

标签: c#

我有一个短路情况有点问题,我需要做的是检查一个数组是否有近2个索引或字符串是否等于某个值,在这里重新创建问题,假设:

string[] favItem = new string[] { "hello", "world", "test", "foo" };
string temp = "hello";
var itemToRemove = temp.Split(',');

foreach(var fav in favItem)
{
   if(fav == "foo" || (itemToRemove.Length > 1 & fav == itemToRemove[0] || fav == itemToRemove[1]))
   {
     //do something
   }
}

基本上我需要将fav与默认值进行比较,如果失败,我需要检查itemToRemove数组是否有近2个索引,如果是,我需要比较{{1迭代中的值,两个索引为fav

现在假设在itemToRemove中只有一个索引,我无法退出:

itemToRemove

特别是(itemToRemove.Length > 1 & fav == itemToRemove[0] || fav == itemToRemove[1]) 如果索引不是两个,我试图退出条件。

在调试模式下,我可以看到带有断点的&值,但我不明白为什么代码会落到:

  

OutOfRangeException

false什么时候应该离开这个条件。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

您的代码有两个问题。

首先,短路布尔“和”运算符为&&&是按位和运算符,不会短路。

其次,&&的优先级高于||,因此您需要将第二个||组合在一起,如此(itemToRemove.Length > 1 && (fav == itemToRemove[0] || fav == itemToRemove[1]))。记住优先级的经验法则是and就像乘法0 && 1 = 0,而or就像加法0 || 1 = 1

答案 1 :(得分:1)

相关问题