我有一个短路情况有点问题,我需要做的是检查一个数组是否有近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
什么时候应该离开这个条件。
我做错了什么?
答案 0 :(得分:4)
您的代码有两个问题。
首先,短路布尔“和”运算符为&&
。 &
是按位和运算符,不会短路。
其次,&&
的优先级高于||
,因此您需要将第二个||
组合在一起,如此(itemToRemove.Length > 1 && (fav == itemToRemove[0] || fav == itemToRemove[1]))
。记住优先级的经验法则是and
就像乘法0 && 1 = 0
,而or
就像加法0 || 1 = 1
。
答案 1 :(得分:1)